我在c++中遇到了一个奇怪的错误,其中一个计算2个小整数加法的语句溢出到一个长值中
I ran into a weird bug in c++ where a statement calculating an addition of 2 small integers overflow into a long long value
我最近遇到了一个我无法理解的奇怪的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不应该超过一个整数值。有人能向我解释一下吗?我真的很感激你的帮助。
感谢
显然,在您的机器上,size_t
是32位整数,而long long
是64位。size_t
总是一个无符号类型,所以您得到:
cout << a.size() - 1
// ^ unsigned ^ promoted to unsigned
// output as uint32_t
// ^ (!)
a.size() - k - 1
// ^ promoted to long long, as of smaller size!
// -> overall expression is int64_t
// ^ (!)
如果size_t
也是64位的,则打印的两个值不会有任何差异(可能是18446744073709551615(,因为有符号的long long k
(int64_t
(会升级为无符号的(uint64_t
(。
请注意,static_cast<UnsignedType>(-1)
总是计算(根据C++转换规则(为std::numeric_limits<UnsignedType>::max()
!
关于size_t
的旁注:它被定义为一个无符号整数类型,其大小足以容纳您可以在系统上为对象分配的最大大小,因此以位为单位的大小取决于硬件,最终与内存地址总线的以位为单元的大小相关(二的一次方不小于(。
vector::size返回size_t(unsigned(,表达式a.size()-k-1
的计算结果为无符号类型,因此最终会出现下溢。
相关文章:
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 如何将一个数组值合并为一个整数c++
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 我可以将迭代器递增一个整数吗?
- 有没有办法生成一个包含平方的序列,这些平方加起来就是一个整数平方?
- 为什么将两个浮点数相加会得到一个整数C++?
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 给枚举一个整数,并在 C++ 中将其相关值作为字符串获取
- 按升序输出整数时,将最后一个整数放在新行上
- 编写一个程序,提示用户输入一个整数,然后输出数字的单个数字和数字的总和
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 给定一个整数,将其表示为平方和
- c++interpret_cast是一个整数
- 以最少的步骤将给定整数转换为另一个整数
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 我需要将字符串(例如 A5)转换为一个字符串 (A) 和一个整数 (5)
- 如何交替从文件中获取一行数据和一个整数?
- 如何让这个C++代码从用户那里读取五个整数而不是一个整数?