1

考虑程序

#include<stdio.h>
int main()
{
  int  x = 33;
  float y = 5;

  printf("%d %d",y,x);
  return 0;
}

输出:

0 1075052544

我可以将 y 的值理解为 0 作为 UB 但 yx 会这样吗?是一个ideone示例。

4

3 回答 3

6

一旦你有未定义的行为,任何事情都可以发生,所以在使用错误的转换说明符打印后你不能真正期望任何合理的事情。

但是,在这种情况下,我们可以重建最有可能发生的事情。

printf是一个可变参数函数,因此它的参数接受默认参数 Promotions。这意味着float参数double在传递给之前被提升到printf.

5的 IEEE754double表示是

0x4014000000000000

编码符号位 0、 的指数2 + 1023 = 1025 = 0x401和 的有效数5/4,去除隐藏的 1 位变为0x4000000000000

打印的值为 0 和1075052544 = 0x40140000。它们分别对应于 5 的低 32 位double和它的高 32 位。

于 2013-06-17T19:16:06.463 回答
1

您使用了不正确的格式,y它是一个浮点数。在printf中,“%d”用于整数 (int),“%f”用于浮点数据 (float)。

这是打印的正确方法x并且y(假设 x 是 int 并且 y 是 float):

printf("%f %d", y, x);

至于x,它可能(我不完全确定)打印不正确,因为在此之前(y)使用了无效格式来打印变量。

于 2013-06-17T19:07:46.147 回答
1

用于%f打印浮点数

printf("%f %d",y,x);
于 2013-06-17T19:08:55.770 回答