最近遇到的大多数bug几乎都是数据过大,产生的错误,因此写一篇博客总结一下常见的几种数据类型他们的表示范围
short
 2个字节(32位,64位均是2个字节),16位,
 -215, 215-1; -32768~32767
 int
 4个字节(32位,64位均是4个字节),32位,所以表示的有符号数的范围是-231, 231-1;也就是-2147483648~2147483647;也就是2G左右;
 long
 32位4个字节 ,-231, 231-1; 2G,和int一样;
 64位8个字节 ,-263,263-1; 9223372T左右,很大;
 long long
 8个字节,-263,263-1; 9223372T左右,很大;
 
 float
 4个字节 32bit
 
 31:符号位
 30~23:指数位
 22~0:尾数位
 float数是先将数字转换为
 科学计数法:(±)1.b x 2c
 因此只需要存储符号(±),尾数c,指数b
 例如: 6.5(D)=110.1=1.101x22
 符号位:0
 尾数:10100000000000000000000
 指数:2+127=129(+127是标准里面的规定)
 也就是10000001
 表示为二进制就是
 0|10000001|10100000000000000000000
 关于float的精度
 指数位有8bit,可以表示的范围为[0,255],减去127就是[-127,128],而全1和全0有其他的用途,因此,实际只能取[-126,127]
 
 因此,float可以表示的最大数为:
 1.11111111111111111111111x2127=
 3.4028235E38
 所以float 范围为:[-3.4028235E38, 3.4028235E38]
float可以精确表示的最大数为
 23位尾数+前面的1,一共24位,可以表示的最大数为
 224-1=16777215=
 1.1111111 11111111 1111111 * 223
 超过了这个数,有些数不能够精确表示,例如16777217=
 1.0000000 00000000 00000000 1 * 224
 尾数部分已经超过了23位,
 如果超过的数正好是[0,16777215]以内的2n倍数,那么也是可以正确表示的,例如16777215*2
 1.1111111 11111111 1111111 * 224
 float表示的小数
 float可表示超过16777216范围的数字是跳跃的,同时float所能表示的小数也都是跳跃的,这些小数也必须能写成2的n次幂相加才可以,比如0.5、0.25、0.125…以及这些数字的和
 像5.2这样的数字使用float类型是没办法精确存储的,5.2的二进制表示为101.0011001100110011001100110011……最后的0011无限循环下去,但是float最多能存储23位尾数,那么计算机存储的5.2应该是101.001100110011001100110,也就是数字 5.19999980926513671875,计算机使用这个最接近5.2的数来表示5.2。关于小数的精度与刚才的分析是一致的,当第8位有效数字发生变化时,float可能已经无法察觉到这种变化了。
float表示的有效位数
 当尾数全为1,表示的数为16777215,1.6777215x107;
 也就是小数点后7位没有问题;
 double
 1bit(符号位)
11bits(指数位)
52bits(尾数位)
原理类似

京公网安备 11010502036488号