点击上方蓝字 江湖评谈设为关注/星标
前言
float类型在内存中的存储跟int是不一样的,本篇看下。
浮点操作
例子:435数值
十进制的435的int类型(十六进制:0x1B3)内存存储:
0000 0001 1011 0011
32位浮点型的内存存储遵循:SEM原则,S(1位)即符号位,0为整数,1表示负数。E(8位)表示指数,为了区分指数的正负数(实际上指数没有正负数)所以指数需要另外+127。M(23位)则是有效数值。
十进制的435浮点型内存存储:
0001 1011 0011
第二步:二进制左移小数点到最左边的1后面,这里即是移动8位。结果是 0001.10110011*2的8次方
=135,二进制的1000 0111,M则是第二步结果小数点后面的数值10110011,忽略掉小数点前面的1 =
1000 0111 10110011000000000000000(01000011110110011000000000000000)
最终内存结果:0x43D98000
也就是说32位的浮点型435在内存中的结果是:0x43D98000。
如果是小数点后面带数字的呢?这里需要把小数点后面的数字乘2,取整数,当小数部分为0则结束。
如:10.5
0.5*2 ==1.0 小数部分为0不再继续乘2了,取整数部分1当有效数值
10的二进制:1010 5的二进制1,则合成:1010.1
取指数:1.0101*2的三次方
SEM整体: S:0 E:1000 0010 M:01010000000000000000000
结果:01000001001010000000000000000000(0x41280000)
这里也涉及到*2一直不为零的状况,比如圆周率3.14,所以涉及到精度问题。duble比float更精确的意思是dobule存储的有效位数更多,更能精确表达。
0.14*2==0.28 0.28*2==0.56 0.56*2==1.12 0.12*2=0.24
0.24*2==0.48 0.48*2==0.96
注意 0.56*2==1.12,这里依然取1.12的小数部分0.12继续乘2来计算。结果依旧遵循SEM原则。
往期精彩回顾