【问题标题】:why there is a integer overflow in this multiplication? [duplicate]为什么这个乘法中有整数溢出? [复制]
【发布时间】:2013-03-16 22:43:48
【问题描述】:

我对这段代码sn-p感到困惑:

#include <climits>
#include <iostream>
int main(void) {
    using namespace std;
    cout << "long max " << LONG_MAX << endl;
    long x = 2 * 1024 * 1024 * 1024;
    cout << "2 * 1024 * 1024 * 1024 = " << x << endl;
    return 0;
}

我原以为应该是 2147483648,但我得到了。使用无符号似乎没有帮助。什么给了?

long max 9223372036854775807
2 * 1024 * 1024 * 1024 = -2147483648

【问题讨论】:

  • 如果你输入1024,它已经有一个数据类型,在这种语言中是整数。这就是为什么如果你想要长数据类型,你需要指定1024L

标签: c++


【解决方案1】:

添加一些Ls*。 long x = 2L * 1024L * 1024L * 1024L;

(从技术上讲,只要一个字面量是long 类型,其他字面量将被提升为long

发生溢出是因为2 等默认为int 类型,并且溢出发生在在赋值之前

参见integer literals,它解释了不同的文字。

【讨论】:

  • 并且签名的 int 最大有 (2^31) - 1,所以 2^31 会溢出一个。 (只是为了让它更完整)。
  • 我错误地认为 upcast 会处理它,显然不是。谢谢
  • @Oliver:溢出发生在赋值之前。另外,请注意有符号整数溢出在 C++ 中是未定义的行为。
  • long 在某些系统上仍然只是 32 位类型;使用LL。此外,firstsecond 文字必须是 long,提升发生在每个 * 的评估期间。在具有 16 位 int 的系统上,2 * 1024 * 1024 * 1024L 在评估最后一个 * 1024L 之前已经溢出 * 1024L,这会强制将左侧提升为 long
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 2018-07-10
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多