【发布时间】: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