考虑一下这个计划
#include<stdio.h>
int main()
{
int x = 33;
float y = 5;
printf("%d %d",y,x);
return 0;
}
输出:
0 1075052544
我能理解y作为UB来0的值,但是y x是这样来的Here是一个ideone示例。
最佳答案
一旦有了未定义的行为,就允许发生任何事情,因此在使用错误的转换说明符打印之后,您不能真正期望任何合理的事情。
然而,在这种情况下,我们可以重建最可能发生的事情。printf
是一个可变函数,因此它的参数会进行默认的参数提升这意味着float
参数在传递给double
之前被提升为printf
。
5的IEEE754double
表示为
0x4014000000000000
对符号位0、指数
2 + 1023 = 1025 = 0x401
和有效位5/4
进行编码,去掉隐藏的1位就变成0x4000000000000
。打印值为0且
1075052544 = 0x40140000
它们分别对应于double
5的低位32位和高位32位。关于c - 考虑程序输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17154908/