请教一下关于浮点数储存的问题。

whitelies125 2018-12-08 03:17:31
网上已经看过相关内容。
但我自己在验证的时候总是自己计算出的二进制和计算机输出的二进制不相同。
即便数字,过程,结果和别人帖子一样,但计算机给出的二进制也不同。
例子:十进制:8.25
转化为二进制:1000.01
写为二进制的科学计数法:1.00001 x 2 ^ 3
由 3 + 127 得到指数位为 130,转化为二进制得:1000 0010
到这里就可以知道,
符号位:0 ;指数位:1000 0010;尾数位:0000 1000 .... ....
如果用 float,32位,写出来应该是:
0100 0001 0000 1000 0000 0000 0000 0000
转化为16进制也就是41080000

问题出现在这里。
我的操作是:
float a = 8.25;
printf("%I64x",a);
结果输出的是4020800000000000

请问为什么会不一致呢?
感谢。
...全文
422 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
whitelies125 2018-12-20
  • 打赏
  • 举报
回复
引用 2 楼 lin5161678 的回复:
首先 符号位:0 ;指数位:1000 0010;尾数位:0000 1000 .... .... 如果用 float,32位,写出来应该是: 0100 0001 0000 1000 0000 0000 0000 0000 尾数前面是4个0 加上指数结尾的0 位数前面应该是5个0 写出来不是 0100 0001 0000 1000 0000 0000 0000 0000 应该是 0100 0001 0000 0100 0000 0000 0000 0000 也就是 41040000 至于你输出的 40208000 是因为printf 会把float 转换为double 再入栈 你输入的其实是 double的前4个字节 你想看到 float的内存表示 可以用
#include <stdio.h>
int main(int argc, char *argv[])
{
	float n = 8.25;
	printf("%X\n", *(int*)&n);
	return 0;
}

之前结帖,忘记感谢了。 今天想起来,特地回来谢谢。 这个论坛我没有找到回复,引用就是回复吧。 Thx
AlbertS 2018-12-12
  • 打赏
  • 举报
回复
引用 2 楼 lin5161678 的回复:
首先
符号位:0 ;指数位:1000 0010;尾数位:0000 1000 .... ....
如果用 float,32位,写出来应该是:
0100 0001 0000 1000 0000 0000 0000 0000
尾数前面是4个0 加上指数结尾的0
位数前面应该是5个0

写出来不是
0100 0001 0000 1000 0000 0000 0000 0000
应该是
0100 0001 0000 0100 0000 0000 0000 0000
也就是
41040000

至于你输出的
40208000
是因为printf 会把float 转换为double 再入栈
你输入的其实是 double的前4个字节

你想看到 float的内存表示 可以用

#include <stdio.h>
int main(int argc, char *argv[])
{
float n = 8.25;
printf("%X\n", *(int*)&n);
return 0;
}

赵4老师 2018-12-12
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
lin5161678 2018-12-10
  • 打赏
  • 举报
回复
首先
符号位:0 ;指数位:1000 0010;尾数位:0000 1000 .... ....
如果用 float,32位,写出来应该是:
0100 0001 0000 1000 0000 0000 0000 0000
尾数前面是4个0 加上指数结尾的0
位数前面应该是5个0

写出来不是
0100 0001 0000 1000 0000 0000 0000 0000
应该是
0100 0001 0000 0100 0000 0000 0000 0000
也就是
41040000

至于你输出的
40208000
是因为printf 会把float 转换为double 再入栈
你输入的其实是 double的前4个字节

你想看到 float的内存表示 可以用

#include <stdio.h>
int main(int argc, char *argv[])
{
float n = 8.25;
printf("%X\n", *(int*)&n);
return 0;
}

赵4老师 2018-12-10
  • 打赏
  • 举报
回复

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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