首页 > 解决方案 > 将 double 转换为 int 仅适用于常量

问题描述

我在 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 相同的结果。

有人可以向我解释为什么会发生这种结果,以及在这里进行基于整数的除法的正确/安全方法是什么?

标签: cfloating-pointprintfinteger-arithmeticconversion-specifier

解决方案


printf("1000 * 0.1 = %d\n", (1000 * 0.1));
//                           int    double

int * double给双。您正在尝试打印double未定义行为(通常写为 UB)。尝试"%d"printf("1000 * 0.1 = %f\n", 1000 * 0.1);

printf("1000 * (10/100) = %d\n", (1000 * (10/100)));
//                                int    int int

int / int进行整数除法,没有小数。10/100产量0(和 的剩余部分10

printf("(int)1000 * 0.1 = %d\n", (int)(1000 * 0.1));
//                                     int    double

双精度100.0转换为int自然打印。请注意,它可能1000 * 0.1会生成99.999999635264318which 将转换为99

printf("(int)1000 * (10/100) = %d\n", (int)(1000 * (10/100)));
//                                          int    int int

10/100整数除法...0在这种情况下,与上面的第二条语句相同。


推荐阅读