运行时错误除以-1

OJF*_*ord 3 c++ xcode integer-division secure-coding

我不怀疑是否需要检查除零.我从来没有听说过负面检查分区!

if( *y == 0 )
    return 0; //undefined
else
    return *x / *y;
Run Code Online (Sandbox Code Playgroud)

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

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

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

我在网上找到的所有建议都是除零,但正如你从上面的检查中看到的,我可以从调试窗口看到,这不是这里的情况.

错误意味着什么,我该如何解决?

ric*_*ici 12

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

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

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

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

  • 相反,有什么"最佳实践"吗?例如,判断结果是零,还是"INT_MAX",还是其他什么? (3认同)