考虑程序
#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示例。
考虑程序
#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示例。
一旦你有未定义的行为,任何事情都可以发生,所以在使用错误的转换说明符打印后你不能真正期望任何合理的事情。
但是,在这种情况下,我们可以重建最有可能发生的事情。
printf
是一个可变参数函数,因此它的参数接受默认参数 Promotions。这意味着float
参数double
在传递给之前被提升到printf
.
5的 IEEE754double
表示是
0x4014000000000000
编码符号位 0、 的指数2 + 1023 = 1025 = 0x401
和 的有效数5/4
,去除隐藏的 1 位变为0x4000000000000
。
打印的值为 0 和1075052544 = 0x40140000
。它们分别对应于 5 的低 32 位double
和它的高 32 位。
您使用了不正确的格式,y
它是一个浮点数。在printf
中,“%d”用于整数 (int),“%f”用于浮点数据 (float)。
这是打印的正确方法x
并且y
(假设 x 是 int 并且 y 是 float):
printf("%f %d", y, x);
至于x
,它可能(我不完全确定)打印不正确,因为在此之前(y
)使用了无效格式来打印变量。
用于%f
打印浮点数
printf("%f %d",y,x);