Integer: 整型数
一般的整型数是32位(4Bytes),长整型则是64位(8Bytes)。另外还有两个8Bytes的类型是:存储地址的指针和double。(双精度浮点)
对于32位的整型而言,有符号和没符号的范围分别如下。
1)无符号
0 - 2^32 - 1
2)有符号
正:0 - 2^31 - 1(因为0占了一个数的表示)。
负:- 2^31 - -1
需要注意的是,整型数的有符号数表示负数是通过补码的规则:实际表示的值是8000 0000(负数) + 剩下的31位的表示的值(正数)。
-1的表示是FFFF FFFF,也就是32位全是1.
而最小的负数则是8000 0000,也就是只有最左边1位是1.
在这里介绍一个C语言的convention:
如果一个表达式既包含有符号数也包含无符号数,那么会被隐式转换成无符号数进行比较。
同样的问题在Java中就不存在这个问题,因为Java当中不存在无符号数一说。如果想要获取无符号值可以转化为long。手动转化。
Float: 浮点数
浮点数需要理解IEEE的浮点数标准。需要知道浮点数并不能准确得表示每个准确的值,所以,在任何的语言当中凡是出现以浮点数的==作为判断条件都需要注意,许多时候,浮点数的等值判断就是坑。
下面来简单介绍下浮点数的格式(图片来源:http://wdxtub.com/2016/04/16/thin-csapp-1/):
一般而言,M的值都是在1-2之间的。其中整数位的1是附赠的,不占frac中的任何一位。但是,除了非正常的浮点数。如果一个浮点数的exp是0的话,那么就是非正常的浮点数。非正常浮点数的M值则是0到1之间。同样,0是附赠的。
另外,还有一点比较绕的是:
exp并不是直接赋给上面的E的。E = exp - bias. Bias = 2 ^ (k - 1) - 1. k是exp的编码位数,所以单精度的Bias = 127.
所以,计算机实际上做的是把任何一个小数近似地用:(-1)^s * 1.(frac) * 2^E来表示。或者中间变为0.(frac).
所以,未必是每一个数都能用这样的approximation来表示。
需要再提一提的是浮点数的向偶取整:
简而言之,是在取舍的保留位数之后,如果有数值(只有后一位是1,其它是0,这种才是可近可不近的时候),看看如果进位后,整个数会不会是偶数,是的话就进位,否则就直接舍掉。其余都是四舍五入。