返回信息流#include<stdio.h>
int main(){
int x=0x00000001;
printf("%x,%d\n",(float)x,(float)x);
return 0;
}
输出各种正负数,任意值。。。
这是一条镜像帖。来源:北邮人论坛 / cpp / #83697同步于 2014/10/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
求大神指教,强制类型转化(float)产生随机值问题
yikoudreams
2014/10/26镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
任意值倒不至于,只是输出的值不太容易理解。
对于printf函数,会有默认的参数类型提升,把float类型提升成double,所以这个函数入栈的参数(除了引导字符串)实际上是两个8字节的double类型,然后用x和d去解析这16个字节,搞清楚1.0的双精度浮点的bit,就可以写出输出了。
0x00,00,00,00,00,00,F0,3F,- 00,00,00,00,00,00,F0,3F
前四个字节按%x输出,得0,接下来4个字节按%d输出的0x3FF00000 = 1072693248
【 在 yikoudreams 的大作中提到: 】
: [code=c]
: #include<stdio.h>
: int main(){
: ...................
感谢回答,是自己菜鸟了,当时写这段是想看看1.0浮点数的存储各位什么样,就盲目的用上了x。不过倒是引出了您关于printf的深入解释,长见识了,不过这段程序的在32位centos上运行,确实得到随机结果?
【 在 gaoweiwei 的大作中提到: 】
: 任意值倒不至于,只是输出的值不太容易理解。
: 对于printf函数,会有默认的参数类型提升,把float类型提升成double,所以这个函数入栈的参数(除了引导
: ...................
常规下是我说的那样的,不过不同的编译器可能会有额外的处理,比如我手中的Ubuntu 32bit下gcc 和clang都是如我说的,但是另一个64bit的ubuntu却用xmm0和xmm1来传参数(64位下,xmm0-4用来传FP型参数),这种情况下分析就不同了。
【 在 yikoudreams 的大作中提到: 】
: 感谢回答,是自己菜鸟了,当时写这段是想看看1.0浮点数的存储各位什么样,就盲目的用上了x。不过倒是引出了您关于printf的深入解释,长见识了,不过这段程序的在32位centos上运行,确实得到随机结果?
: [upload=1][/upload]
希望能早日达到您的水平。。。
【 在 gaoweiwei 的大作中提到: 】
: 常规下是我说的那样的,不过不同的编译器可能会有额外的处理,比如我手中的Ubuntu 32bit下gcc 和clang都是如我说的,但是另一个64bit的ubuntu却用xmm0和xmm1来传参数(64位下,xmm0-4用来传FP型参数),这种情况下分析就不同了。