运行时错误除以-1

Runtime error dividing by -1

本文关键字:运行时错误      更新时间:2023-10-16

我不怀疑是否需要检查除以零。不过,我从来没有听说过用负数检查除法!

if( *y == 0 )
    return 0; //undefined
else
    return *x / *y;

x, y是指向int32_t的指针,我在相关的情况下包括了这个细节。

在运行时,如果*x==0x80000000, *y==0xffffffff,我会得到错误(在Xcode中):

EXC_ARITHMETIC(代码=EXC_I386_DIV,子代码=0x0)

我在网上能找到的只是建议它被零除,但正如你从上面的检查中看到的,我也从调试窗口中看到的那样,这里的情况并非如此。

这个错误是什么意思?我该如何修复它?

2的补码表示是不对称的:负数比正数多出一个,而这个负数没有正数。因此,否定MIN_INT是整数溢出(其中MIN_INT是仅1位为符号位的值,对于32位整数为0x80000000)。

因此,MIN_INT / -1也是一个算术溢出。与减法的溢出(很少检查)不同,除法时的溢出可能会导致陷阱,显然这就是您的情况。

是的,从技术上讲,在除法之前应该检查MIN_INT / -1溢出情况,因为结果是未定义的。

注意:在英特尔x64体系结构的常见情况下,除法溢出会陷阱,与除以0完全相同。令人困惑的是,对应的Posix信号是SIGFPE,通常被认为是"浮点异常",尽管看不到浮点。当前的Posix标准实际上将SIGFPE解释为"错误算术运算"。