最近遇到的大多数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(尾数位)

原理类似