我在C++中使用整数除法面临一些奇怪的结果。我正在计算这个: -2147483648/-1

我得到的是在3种不同情况下的3种不同结果:

int foo(int numerator, int denominator) {
    int res = numerator / denominator; // produces SIGFPE, Arithmetic exception interrupt

    cout << res << endl;
}

int main() {
    int res = -2147483648 / -1;
    cout << res << endl;               // prints -2147483648
    cout << -2147483648 / -1 << endl;  // prints 2147483648
    foo(-2147483648, -1);
    return 0;
}

为什么整数除法在不同情况下会产生不同的结果?

最佳答案

文字-2147483648 / -1由编译器计算为2147483648,其数据类型足以容纳该值。

直接打印文字时,它将正确打印该值。

当文字存储在res中时,将其转换为intint在您的系统上似乎为32位宽。值2147483648不能表示为32位带符号整数,因此强制转换会导致溢出。在您的系统上,此溢出导致值-2147483648(可能使用二进制补码)。

最后,当尝试在运行时执行除法时(在foo函数中),由于溢出(由于SIGFPE数据类型无法表示结果)而导致int异常。

请注意,所有这三个选项都依赖于平台相关的行为:

  • 字面量计算溢出时编译器不会生成任何错误(或其他问题)的事实,只是使用足以容纳结果
  • 的数据类型
  • 存储文字时int溢出会生成该特定值(并且没有其他问题)的事实
  • 运行时溢出时,会引发SIGFPE异常
  • 关于c++ - C++整数除法如何处理极限值和负值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38769856/

    10-08 21:41