3

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

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)

我在网上只能找到除以零的建议,但正如您从上面的检查中看到的那样,我可以从调试窗口中看到,这里不是这种情况。

错误是什么意思,我该如何解决?

4

1 回答 1

11

2 的补码表示是不对称的:负数比正数多一个,并且该负数没有正对应物。因此,求反MIN_INT是整数溢出(其中MIN_INT只有 1 位是符号位的值,0x80000000 表示 32 位整数)。

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

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

注意:在 Intel x64 架构的常见情况下,除法溢出确实陷阱,与除以 0 完全相同。令人困惑的是,对应的 Posix 信号SIGFPE通常被认为是“浮点异常”,尽管其中没有浮点视线。当前的 Posix 标准实际上掩盖SIGFPE了“错误的算术运算”的意思。

于 2014-11-02T22:38:58.867 回答