【发布时间】:2015-06-07 16:20:27
【问题描述】:
我正在调试一个用 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 平台上编译和运行它时,不会发生这种情况(尝试除以零时会崩溃)。
想知道这个大商背后的原理。不确定这是否只是我还需要发现的其他错误。 有人可以帮助我完成另一个相同的程序吗?
【问题讨论】:
-
整数除以零产生未定义的行为。您应该对
sr == 0执行显式检查。 -
我相信,在 PowerPC 上它会产生某种异常。它是在某些操作系统上运行还是在裸机上运行?
-
@Eugene : 它有 NetBSD 5.1 作为操作系统
-
@EugeneSh。根据this,它只是设置了一堆标志(编译器可能会忽略)
-
@harold 这是一个运行时错误,所以编译器不在循环中。我相信在 *nix-like 系统上应该发出 SIGFPE 信号。
标签: c integer-division divide-by-zero integer-arithmetic powerpc