32位有符号整数除法在PowerPC

时间:2015-06-07 16:20:27

标签: c integer-division divide-by-zero integer-arithmetic powerpc

我正在调试用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的英特尔平台上编译和运行相同时,这不会发生(当尝试除零时崩溃)。

想知道这个大商背后的原理。不确定是否只是其他一些我还需要揭开的错误。 有人可以帮助我使用另一个同样的程序吗?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

根据PPC架构手册(您可以从IBM获得),在PPC上除以0不会产生任何类型的信号或陷阱;相反,您只需获得一些因处理器而异的不确定值。在您的情况下,它看起来在将正数除以0时生成MAXINT(最大正整数)的特定PPC变体。