我在 C 中发现了一个奇怪的(对我来说)强制转换行为int
。Appologies 如果这是一个基本问题,但我无法找到为什么以下代码会产生意外结果的答案。
#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 相同的结果。
有人可以向我解释为什么会发生这种结果,以及在这里进行基于整数的除法的正确/安全方法是什么?