我不怀疑是否需要检查除零。我从来没有听说过以负面的方式检查分裂!
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)
我在网上找到的所有建议都是除零,但正如你从上面的检查中看到的那样,我可以从调试窗口看到,这不是这里的情况。
错误意味着什么,我该如何解决?
答案 0 :(得分:12)
2的补码表示是不对称的:有一个负数而不是正数,而负数没有正对应。因此,否定MIN_INT
是整数溢出(其中MIN_INT
是唯一的1位是符号位的值,对于32位整数是0x80000000)。
MIN_INT / -1
也是算术溢出。与减法溢出(很少检查)不同,分割时溢出会导致陷阱,显然是你的情况发生了什么。
而且,是的,从技术上讲,你应该在分割之前检查MIN_INT / -1
溢出情况,因为结果是未定义的。
注意:在Intel x64架构的常见情况下,除法溢出确实陷阱,与除以0完全相同。令人困惑的是,相应的Posix信号为SIGFPE
,通常被认为是as"浮点异常#34;虽然看不到浮点。当前的Posix标准实际上将SIGFPE
视为意义"错误的算术运算"。