现代计算机存储和处理的信息以二值信号表示,这些二进制数字,或者称为位(bit),奠定了数字革命的基础。
为什么要选二进制,因为二值信号能够很容易地被表示、存储和传输。想了解详细的内容可以阅读《编码的奥秘》。
三种最重要的数字表示:
- 无符号编码 传统二进制表示法,大于等于零
- 补码编码 有符号整数,可正可负
- 浮点数编码 以二为基数的实数科学记数法
计算机是用有限数量的位来对一个数字编码,因此当结果太大到无法表示的时候,就会溢出。溢出发生会产生一些吃惊的结果,这个问题程序员必须注意。
注意浮点运算和整数运算有不同的数学属性,它们处理数字表示有限性的方式不同—整数的表示虽然只能编码一个相对较小的数值范围,但是这种表示是精确的;而浮点数虽然可以编码一个较大的数值范围,但是这种表示只是近似的。
1 #include <stdio.h>
2
3 int main()
4 {
5 float a=(3.14 + 1e20) - 1e20;
6 float b=3.14 + (1e20 - 1e20);
7
8 printf("a=%f\nb=%f\n",a,b);
9
10 return 0;
11 }
~
运行结果:
root@kali:~/Desktop/c/csapp/chapter2# ./2-0
a=0.000000
b=3.140000
为什么会这样呢?这个问题在以后会得到详细的回答。
大量计算机的安全漏洞都是由于计算机算术运算的微妙细节引发的,在这章,我会有详细的描述和解释。
- 2.1 信息存储