gpt4 book ai didi

c - C : compiler bug or defined behaviour? 中的类型混合整数除法

转载 作者:太空宇宙 更新时间:2023-11-04 00:44:43 24 4
gpt4 key购买 nike

在为使用 GCC 编译的小型 ARM 处理器编写软件时,我遇到了一个怪癖。该处理器没有硬件除法引擎,除法是通过软件实现的。

以下代码复制了该行为,volatile 语句用于避免优化:

volatile int32_t x = -4000;
volatile uint32_t y = 4;
volatile int32_t z = x / y;

uart_printf(DBG_LVL_INFO, "%d / %d = %d\r\n", x, y, z);

z 的打印结果是 1073740824,但我希望结果是 -1000

类型混合似乎很关键。将 uint32_t 替换为 int32_t 可解决此错误。

-1000 被错误地解释为无符号整数不会产生结果,有趣的是,结果似乎等于结果加 230

这是一个错误,还是只是定义的行为?

最佳答案

在 C 上进行数学运算时,较窄 类型将被转换为较宽 类型。在您的情况下,所有 int32_t 变量都转换为 uint32_t,这是由于 promotion 效果。

-4000uint32_t 中是一个非常大的数字。事实上,它是 0xFFFFFFFF - 4000,大约是 40 亿。如果将 40 亿(和一些东西)除以 4,就会得到结果。

通过在所有地方使用相同的类型或在使用变量之前进行转换来解决您的问题:

volatile int32_t z = x / (int32_t)y;

打印结果时,%d 使用 int32_tuint32_t 是未定义的行为,因为它只适用于 int 类型。

关于c - C : compiler bug or defined behaviour? 中的类型混合整数除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47035549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com