考虑一下这个计划

#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它们分别对应于double5的低位32位和高位32位。

关于c - 考虑程序输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17154908/

10-11 12:15