【发布时间】:2021-11-14 11:06:30
【问题描述】:
我发现在 C 中转换为 int 的奇怪行为(对我来说)。如果这是一个基本问题,我很抱歉,但我无法找到为什么以下代码会产生意外结果的答案。
#include <stdio.h>
int main(void)
{
printf("1000 * 0.1 = %d\n", (1000 * 0.1));
printf("1000 * (10/100) = %d\n", (1000 * (10/100)));
printf("(int)1000 * 0.1 = %d\n", (int)(1000 * 0.1));
printf("(int)1000 * (10/100) = %d\n", (int)(1000 * (10/100)));
return 0;
}
-O0 和 -O3 的结果相同:
1000 * 0.1 = -957043896
1000 * (10/100) = 0
(int)1000 * 0.1 = 100
(int)1000 * (10/100) = 0
我希望前两个结果没有意义(我不知道为什么,但我希望将 double 传递给 int 参数不应该起作用)。然而,3 和 4 之间的差异让我感到困惑。我希望 (10/100) 在编译时计算并呈现与 3 相同的结果。
有人可以向我解释为什么会出现这种结果,以及在这里进行基于整数的除法的正确/安全方法是什么?
【问题讨论】:
-
在
printf("1000 * 0.1 = %d\n", (1000 * 0.1));中,%d承诺你会通过int,但实际上你已经通过了double。一个好的编译器会发出警告。 -
第一个
printf是未定义的行为,因为它需要doubles 而格式说明符是int -
10/100是整数数学,将是0。 -
那么它是否假设整个表达式,即两个部分,都将是整数数学?
-
假设是错误的词。它是整数数学,除非有强制转换或其中一个操作数是浮点常量。
标签: c floating-point printf integer-arithmetic conversion-specifier