gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:33:17 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com