c - 将 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 相同的结果。
有人可以向我解释为什么会发生这种结果,以及在这里进行基于整数的除法的正确/安全方法是什么?
解决方案
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.999999635264318
which 将转换为99
printf("(int)1000 * (10/100) = %d\n", (int)(1000 * (10/100))); // int int int
10/100
是整数除法...0
在这种情况下,与上面的第二条语句相同。
推荐阅读
- jenkins - 如何在 Jenkins 上对 Docker 映像进行版本控制并将其传递给 Kubernetes YAML 文件
- android - android kotlin exo player 响应码:401
- javascript - javascript / jQuery - 替换正文中所有出现的字符串而不替换整个正文的最有效方法是什么
- javascript - 使用 node js 将 fs 代码转换为 fs-extra
- java - Java 文件命名限制
- python - 通过 Selenium Python 登录 Google 不工作
- java - android studio app does not run on emulator
- angular - 如何在 Angular 中注释扩展组件类?(遗产)
- reactjs - 通过 useEffect Hook 在本地状态更改后更新 DOM
- python - 如何使用 find_nearest_contour?