gpt4 book ai didi

c - 32 位有符号整数除法在 PowerPC 上给出 0x7fffffff 作为商

转载 作者:太空狗 更新时间:2023-10-29 15:26:15 26 4
gpt4 key购买 nike

我正在调试用 C 编写的生产代码,其最简单的形式可以显示为 -

void
test_fun(int sr)
{
int hr = 0;
#define ME 65535
#define SE 256

sr = sr/SE; <-- This should yield 0
if(sr == 1)
hr = ME;
else
hr = (ME+1)/sr; <-- We should crash here.
}

我们将 sr 作为 128 传递,理想情况下应该在处理器中产生被零除错误。我看到这个除法成功地发生了,商为 0x7ffffffff(hr 是这个值)。当我使用 gcc 在 Intel 平台上编译和运行时,这不会发生(尝试除以零时会崩溃)。

想知道这个大商背后的原理。不确定这是否只是我仍然需要发现的其他错误。有人可以帮我开发另一个具有相同功能的程序吗?

最佳答案

除以零是 undefined behaviour , 请参阅 C11 standard 6.5.5#5 (最终草案)。

获取陷阱或 SIGFPE 只是 CPU/OS 的礼貌。 PowerPC 作为典型的 RISC CPU 不会捕获它,因为它可以通过在进行实际除法之前对除数进行简单检查来安全地检测到。 x86 OTOH 确实捕捉到这个 - 典型的 CISC 行为。

如果更高层标准要求,您可能错过了自动发出此检查的编译器选项。例如,POSIX 不强制执行 SIGFPE,这是可选的。

关于c - 32 位有符号整数除法在 PowerPC 上给出 0x7fffffff 作为商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30695786/

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