【C语言】浮点数的内存存储

float型: 4字节 32bit

高位 -> 低位

首先将数转换为二进制,如下格式:

打个比方:

发现M中,小数点前必为1,所以可以默认没有必要存储,所以实际可以存储24bit的M,因为小数点前唯一一位必为1;

参考:


对于E,会采用unsigned型存储,所以为了使其可覆盖到部分负数,会加上一个中间值,float存储中E占8位,加中间值127,使E的范围变成[ -127, 128 ];

double存储中E占11位,加中间值1023,使E的范围变成[ -1023, 1024 ]

参考:


打开clion,验证一下十进制浮点数 9.5 在c语言内存中的存储:

先自己模拟一下:

s = 0, M = 0011, E = 3 + 127 =130

高位 -> 低位

s: 0 E: 100;0 001;0 M: 001;1 000;0 000;0 000;0 000;0 000 

将其用0x表示得:

高位 -> 低位

0x 41 18 00 00

转为小端存储:(高地址存高位,低地址存低位)

低地址 -> 高地址

0x 00 00 18 41

debug 发现四字节中存储内容为 0x 00 00 18 41 计算正确!

 上题:

int n = 9;
高位 -> 低位
//  0000 0000; 0000 0000; 0000 0000; 0000 1001
float * p = (float *)&n;
// s = 0 +;
// E = 0000 0000 - 127,  2^-127
// M = 1. 000 0000 0000 0000 0000 1001
// 因为 E全0,为很小的数字 M第一位直接改0以接近0
// 所以最终结果为 (-1)^0 * 0. 000 0000 0000 0000 0000 1001 * 2^-127
*p = 9.0;
// (-1)^0 * 1.001 * 2^3
// s:0 E:3 + 127 = 130; M: 001
// 0 1000 0011 0010 0000 0000 0000 0000 000
// 0 100;0 001;1 001;0 000;0 000;0 000;0 000;0 000
// 高位 -> 低位
// 0x 41 90 00 00
// 低地址 -> 高地址
// 小端存储: 00 00 90 41
printf("%d\n", n);
// 2^30 + 2^24 + 2^23 + 2^20
printf("%f\n", *p);
// 9.0

运行结果:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值