【发布时间】:2016-11-30 12:55:05
【问题描述】:
声明
printf("%f\n",0.0f);
打印 0。
然而,声明
printf("%f\n",0);
打印随机值。
我意识到我表现出某种未定义的行为,但我无法弄清楚具体原因。
所有位为 0 的浮点值仍然是有效的 float,值为 0。float 和 int 在我的机器上大小相同(如果这甚至相关) .
为什么在printf 中使用整数文字而不是浮点文字会导致这种行为?
附:如果我使用,可以看到相同的行为
int i = 0;
printf("%f\n", i);
【问题讨论】:
-
printf期待一个double,而你给它一个int。float和int在您的机器上可能是相同的大小,但是当推入可变参数列表时,0.0f实际上会转换为double(并且printf预计会这样)。简而言之,根据您使用的说明符和您提供的参数,您没有履行与printf的交易。 -
可变参数函数不会自动将函数参数转换为相应参数的类型,因为它们不能。与具有原型的非可变参数函数不同,编译器无法获得必要的信息。
-
噢……“可变参数。”我刚学了一个新词……
-
接下来要尝试的是传递
(uint64_t)0而不是0并查看是否仍然会出现随机行为(假设double和uint64_t具有相同的大小和对齐方式)。由于在不同的寄存器中传递了不同的类型,因此在某些平台(例如 x86_64)上,输出可能仍然是随机的。
标签: c++ c printf implicit-conversion undefined-behavior