提问关于浮点数存储

zll_lover 2010-10-21 10:43:26
: float i = 120.5;
00401028 mov dword ptr [ebp-4],42F10000h
这是在vc下调试的结果,
可我看了下浮点数的存储规则,感觉这个数不对啊,请帮忙解答下吧谢谢,这个数是如何算出来的呢?
...全文
79 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ashamwolf 2010-10-21
  • 打赏
  • 举报
回复
不懂。浮点数变量名称用i不太合适吧。
wjb_yd 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zrcvic 的回复:]
120.5 = 241 / 2 = (后面全都是二进制:)1.1110001 * ( 10 ^ 110 )

IEEE 754 浮点数表示法中 32 位浮点数(float)的表示:
1位符号位 + 8位指数 + 23位有效数

首先这个数是正数,所以符号位为0;
指数是二进制的 110 十进制的 6,根据标准加上指数偏移 127,结果是 133,即二进制的 10000101;
有效数……
[/Quote]

正解,讲的很清楚了。
ayw215 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zrcvic 的回复:]

120.5 = 241 / 2 = (后面全都是二进制:)1.1110001 * ( 10 ^ 110 )

IEEE 754 浮点数表示法中 32 位浮点数(float)的表示:
1位符号位 + 8位指数 + 23位有效数

首先这个数是正数,所以符号位为0;
指数是二进制的 110 十进制的 6,根据标准加上指数偏移 127,结果是 133,即二进制的 10000101;
有效……
[/Quote]
顶这个
赵4老师 2010-10-21
  • 打赏
  • 举报
回复
//c:\>symdeb
//Microsoft (R) Symbolic Debug Utility Version 4.00
//Copyright (C) Microsoft Corp 1984, 1985. All rights reserved.
//
//Processor is [80286]
//-es 100
//186D:0100 +0.1673151455515419E-32 120.5
//186D:0104 +0.1141506958401983E-9
//-db 100 l4
//186D:0100 00 00 F1 42 ..qB
//-ds 100 l1
//186D:0100 00 00 F1 42 +0.1205E+3
//-q
//c:\>
zrcvic 2010-10-21
  • 打赏
  • 举报
回复
120.5 = 241 / 2 = (后面全都是二进制:)1.1110001 * ( 10 ^ 110 )

IEEE 754 浮点数表示法中 32 位浮点数(float)的表示:
1位符号位 + 8位指数 + 23位有效数

首先这个数是正数,所以符号位为0;
指数是二进制的 110 十进制的 6,根据标准加上指数偏移 127,结果是 133,即二进制的 10000101;
有效数为 1.1110001,首先规格化,去掉前面的 “1.”,变成 1110001,不够 23 位后面补 0(注意是后面,因为 1.1 相当于 1.1000000),变成 11100010000000000000000;

所以结果为:
0 10000101 11100010000000000000000,按字节拆分,变成:
01000010 11110001 00000000 00000000,就是十六进制的 42 F1 00 00 了。所以那个数是正确的

当然存到内存里的时候,需要按照 CPU 的字节序进行调整,如果 CPU 是小端在前的,比如 Intel 的 x86,那么储存的时候就是:
????????: 0x00
???????? + 1: 0x00
???????? + 2: 0xF1
???????? + 3: 0x42

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧