C++ float的内存布局

IEEE754标准中,浮点数的内存布局

以下仅以float(内存中占据4个字节,32bits)来说明,double(8个字节,64bits)同理,只是有细微的差别。

float的内存分布

IEEE754规定,32bit的float在内存中是这样分布的:

符号位(S)阶码(E)尾数(M)
1823

整数、浮点数在内存中都是以二进制的形式存在的(补码),而浮点数是二进制下的科学计数法存储在内存中的。可以表示 为:$ s 1.m^e$

  • 符号位占据一个比特,当S = 0时表示正数,当S = 1时表示负数。
  • 阶码e则是其指数再加上一个偏移量(127)后的数,其总共占据了8个字节,8位无符号数的范围是0~255,考虑到已经加了一个偏移量,则其实际可表达的范围是-128~127(这个范围是指二进制计数法下的范围)。
  • 尾数m占据了23个字节,由于是使用的二进制下的科学计数法,所以任何浮点数(除了0)都隐含了一个1,也就是说,其尾数实际上在前面应该再加一个1,即:1.m,这样,浮点数的二进制精度是24位,而$2^{24} = 16777216$,所以其十进制下的精度是7位有效数字。
计算实例

1, 十进制与二进制的互转
二进制转十进制比较简单,就是对应位乘以对应的2的幂次,比如:101.1011,其转换过程为:
$$1*2^2 + 0 * 2^1 + 1 * 2^0 + 1 * 2^{-1} + 0 * 2^{-2} + 1 * 2^{-3} + 1 * 2^{-4}$$
十进制整数转二进制比较简单,一是8421来凑,一是除2倒序排,不再解释。
十进制小数转二进制,就是一直乘2,如果大于1,则置1,如果小于1,则置0,一直乘2,直到为0或达到指定位数为止。
比如0.125:
$$ 0.25 * 2 = 0.5 --- 0 \\ 0.5 * 2 = 1 --- 1$$
则其二进制为:0.01。
再比如:0.632:
$$ 0.632 * 2 = 1.264 --- 1 \\ 0.264 * 2 = 0.528 ---0 \\ 0.528 * 2 = 1.056 ---1 \\ 0.056 * 2 = 0.112 ---0 \\ ...$$
则其二进制为:0.1010….。
2, 计算float的内存布局
2.1 考虑float fa = 4.25,那么:int ia = *(int*)&fa是多少呢?
我们知道,4.25 = 100.01,化成指数表示为:$1.0001*2^2$,则其符号位S = 0, 阶码e = 2 + 127 = 0x81,其尾数部分二进制表示为:1000 1000 0000 0000 0000 0000,总共24位,将尾数的最高位的1去掉,再与阶码e,符号位S组合后:

符号位(S)阶码(E)尾数(M)
01000 0001000 1000 0000 0000 0000 0000

合起来就是:
0100 0000 1000 1000 0000 0000 0000 0000,即:ia = 0x40880000
2.2 再考虑float fa = -0.0125,那到:c++ int ia = *(int*)&fa是多少呢?
-0.0125 = -0.00000011001100110011001100...,转换成指数为:$-1.10011001100110011001100…*2^{-7}$,则其符号位S = 1,阶码e = -7 + 127 = 0x78,其尾数部分用二进制表示为:1100 1100 1100 1100 1100 1101,后面的位数就被四舍五入截断了,由于最后一位的后一位是1,则向前进1,同样保留24位,将其最高位的1去掉,再与阶码和符号位组合:

符号位(S)阶码(E)尾数(M)
10111 1000100 1100 1100 1100 1100 1101

全起来就是:
1011 1100 0100 1100 1100 1100 1100 1101,即:ia = 0xbc4ccccd

如果将ia转换成fa,则转换过程相反。





转载于:https://www.cnblogs.com/beichen2012/p/5756321.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值