c++ - 我在 C++ 中遇到了一个奇怪的错误,其中计算两个小整数相加的语句溢出到一个 long long 值
问题描述
我最近遇到了一个我无法理解的奇怪的 C++ 错误。这是我的代码:
#include <bits/stdc++.h>
using namespace std;
typedef vector <int> vi;
typedef pair <int, int> ii;
#define ff first
#define ss second
#define pb push_back
const int N = 2050;
int n, k, sum = 0;
vector <ii> a;
vi pos;
int main (void) {
cin >> n >> k;
for (int i = 1; i < n+1; ++i) {
int val;
cin >> val;
a.pb(ii(val, i));
}
cout << a.size()-1 << " " << k << " " << a.size()-k-1 << "\n";
}
当我尝试测试时:
5 5
1 1 1 1 1
它返回:
4 5 4294967295
但是当我从以下位置更改声明时:
int n, k, sum = 0;
到:
long long n, k, sum = 0;
然后程序返回正确的值,即:
4 5 -1
我无法弄清楚为什么程序会这样,因为 -1 不应超过整数值。谁能给我解释一下?我真的很感激你的帮助。
谢谢
解决方案
vector::size 返回 size_t (无符号),表达式的a.size()-k-1
计算结果为无符号类型,因此您最终会出现下溢。
推荐阅读
- macos - VS Code 如何在 macOS 上“正常”使用帮助/插入键?(没有截取)
- powershell - 在powershell中为什么我们使用“-gt”以及它意味着什么?
- javascript - 用JS获取远程页面的HTML内容
- excel - 带有 3 个框的 IF 公式的 Excel 问题
- python - How to format numbers in plotly and avoid conversion to millions
- r - pivot_wider() 不会将变量折叠成单行
- r - 如何找到适合 R 上一系列点的曲线?
- c - 如何在 C 中正确重新分配位数组
- oracle - Oracle:在过程中返回带有光标的大型数据集
- python - 在 python 中找不到 azure 中的目录或文件