【发布时间】:2013-05-12 12:55:11
【问题描述】:
我正在为 Little Endian 使用 Visual Studio TC 编译器。 以下是一段代码:
void main()
{
float c = 1.0;
int a = 0x3F800000;
int *ptr = (int *)&c;
printf("\n0x%X\n", *ptr);
printf("\na = %f", a);
printf("\nc = %f", c);
return;
}
输出是:
0x3F800000
a = 0.000000
c = 1.000000
浮点值 1.0 是 0x3F800000 并在内存中存储为 00 00 80 3F 用于 Little Endian。 将相同的值分配给 int a。 printf 如何为 int 打印 0.000000 而为 float c 打印 1.000000?我已经看到它在 printf 中使用 %f 打印时将所有整数值打印为 0.000000。
另外,既然printf是可变参数函数,它怎么知道寄存器中传递的值是int还是float?
【问题讨论】:
-
它是因为未定义的行为。
-
给出
%f的格式说明符并给出一个int类型的参数。 -
printf() 不会猜测作为参数给出的变量类型。它只信任用户指定的标志。
-
任何
float参数在传递给函数时都会提升为double。要确切了解发生了什么,请让编译器生成汇编输出,并查看为每个printf()语句生成的代码的差异。 -
第 7.21.6/9 节说 “如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。 "。这适用于 fprintf,但同样适用于 printf。