C++中, float 在内存中是怎样存储的?
首先 float 在内存中 占 32-bit。浮点型 在内存中,有3部分构成。
- 符号位(Sign bit)
- 指数位(Exponent)
- 尾数位(Mantissa)
符号位是指浮点数在内存中的 最高位,0 表示 正数,1 表示负数。
指数位是指浮点数在以科学计数法表示时的指数值,此处:1、科学计数法以二进制形式体现,因此是指以2为底的指数,2、为解决指数为负时无法存储的现象,此处的指数值在存储时需加上偏移量127.
尾数部分保存的是float型变量以二进制形式体现时所表示的的小数部分
如:9.125=2^3+2^1+2^(-3)
其二进制形式为:1001.001,二进制形式科学计数法为:1.001001 * 2^3
此时,float数据9.125的存储形式为:
9.125为正数,因此符号位为 0
9.125二进制形式以科学计数法表示时,指数为3,因此指数位为:3+127=130,其二进制形式为:1000 0010
9.125二进制形式以科学计数法表示时,其小数部分为001 001,因此尾数部分保存数据为001 001,其余位以0补充
因此,9.125的内存存储形式二进制结果位:0 10000010 00100100000000000000000
又如:float数据0.123=2^(-4)+2^(-5)+2^(-6)+2^(-7)+2^(-9)+......:
其二进制形式为:0.000111....,二进制形式科学计数法为1.11......* 2^(-4)
此时,float数据0.123的存储形式为:
0.123为正数,因此符号位为0
0.123二进制形式以科学计数法表示时,指数为-4,因此指数位为(-4)+127=123,其二进制形式为:0111 1011
0.123二进制形式以科学计数法表示时,其小数部分为111 1011 1110 0111 0110 1101,尾数部分23bit可全部占满
因此,0.123的内存存储形式二进制结果:0 01111011 11110111110011101101101
针对随手写一个32bit的float数据的二进制数据:
0 0111 1111 101 0110 0000 0000 0000 0000
其符号位为0,说明该float型数据为正
其指数位为:0111 1111,转换10进制为127,因此该float数据的二进制形式科学计数法表示时,指数为:127-127=0
其尾数部分为101 0110 0000 0000 0000 0000,因此该float数据二进制科学计数法表示形式为1.101 0110 0000 0000 0000 0000* 2^0
即:1 * 2^0 + 1 * 2^(-1) +1 * 2^(-3) +1 * 2^(-5) =1.65625
参考:http://chuansu.iteye.com/blog/1484917
https://www.cnblogs.com/wuyuankun/p/3984385.html