aka*_*ash 1 c floating-point printf undefined-behavior
考虑一下该计划
#include<stdio.h>
int main()
{
int x = 33;
float y = 5;
printf("%d %d",y,x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
0 1075052544
Run Code Online (Sandbox Code Playgroud)
我可以理解y作为UB的0的价值,但yx即将到来?这是一个想法样本.
一旦你有未定义的行为,任何事都可以发生,所以你不能真正期望在使用错误的转换说明符打印后有任何明智之处.
但是,在这种情况下,我们可以重建最有可能发生的事情.
printf是一个可变函数,因此它的参数经过默认参数提升.这意味着在传递float参数double之前将其提升为printf.
IEEE754 double表示为5
0x4014000000000000
Run Code Online (Sandbox Code Playgroud)
编码符号位0,指数2 + 1023 = 1025 = 0x401和有效数5/4,删除隐藏的1位变为0x4000000000000.
打印的值为0和1075052544 = 0x40140000.它们分别对应于5的低32位double和高32位.