【问题标题】:Integer overflow takes place even if I type cast to long int (C++) [closed]即使我将类型转换为 long int (C++) [关闭],也会发生整数溢出
【发布时间】:2021-09-27 09:01:43
【问题描述】:

我试图理解溢出现象,并决定通过执行下面提供的代码来演示:

#include <bits/stdc++.h>

using namespace std;

int main(){
    int a = 100000;
    int b = 100000;
    cout << a * b << endl; 
    long int c = a * 1LL * b;
    cout << c;
    return 0;
} 

这个想法是简单地将 a 和 b 相乘(如第 6 行中所做的那样)会导致整数溢出,因为 10^10 超出了整数数据类型的范围。为了克服这个问题,乘积 (a*b) 与文字 '1LL' 相乘(如第 7 行所示)。 问题是整数溢出仍然发生,因为程序的输出是:

1410065408
1410065408

我可能在某个地方犯了一个超级愚蠢的错误,但我已经花了足够多的时间试图了解哪里出了问题,但我还没有找到原因。希望在这里得到一些帮助/指导:)

【问题讨论】:

  • 你确定long int 比你机器上的int 大吗? long long int 也会发生这种情况吗?
  • long int 只保证宽度不小于 32 位:en.cppreference.com/w/cpp/language/types。这就是存在固定宽度类型的原因:en.cppreference.com/w/cpp/types/integer
  • @Yksisarvinen,我认为它会更大。不知道尺寸会因不同的机器而异。感谢您引起我的注意。将 c 的数据类型更改为 long long int 确实使程序工作。
  • @cmannett85 我不知道,我想我应该对此进行更多研究。感谢您的信息!

标签: c++ casting integer-overflow


【解决方案1】:

1LL 的类型是 long long int。它的大小至少为 8 个字节。 c 的类型是 long int。它的大小至少为 4 个字节。因此,您可能仍然有溢出。为避免这种情况,您可以使用auto:

#include <iostream>
#include <cstdint>

int main() {
  std::uint32_t a = 100'000;
  std::uint32_t b = 100'000;

  auto r1 = a * b;
  auto r2 = static_cast<std::uint64_t>(a) * b;

  std::cout << "r1 = " << r1 << '\n' 
    << "r2 = " << r2 << '\n';
}

Try Online

【讨论】:

  • 没有必要使用auto。只需将c 声明为uint64_t(或long long)。
  • @TonyK auto 使该过程自动化:)
【解决方案2】:

似乎是环境问题 - 对我来说很好。

cat long_int_ex.cpp; g++ -O2 long_int_ex.cpp ; a.out; g++ --version
#include <bits/stdc++.h>

using namespace std;

int main(){
    int a = 100000;
    int b = 100000;
    cout << a * b << endl; 
    long int c = a * 1LL * b;
    cout << c << endl;
    return 0;
} 
1410065408
10000000000
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2020-04-08
    相关资源
    最近更新 更多