c++ - C++ 整数除法如何用于限制和负值?

标签 c++ integer precision 16-bit integer-division

我在 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/

相关文章:

python - 将浮点值转换为两位小数

binary - 十进制 float 与二进制的相互转换

c++ - 为什么我不能使用 __declspec(dllexport) 从 COM DLL 导出 DllGetClassObject()?

c++ - 时间类问题

c++ - 一个类使用第二个类,第二个类使用第一个类中定义的结构

c++ - shared_ptr : "is not a type" error

java - 一个简单的 int 比较导致问题

c - `int` 类型大小 int C

python - 如何拆分整数并将部分分配给变量

floating-point - PHP 8 浮点小数点不同于 PHP 7