奇怪的溢出赋值 2 * 1024 * 1024 * 1024
Strange overflow assigning 2 * 1024 * 1024 * 1024
void main()
{
long long ll = 2 * 1024 * 1024 * 1024;
unsigned long long ull = (2 * 1024 * 1024 * 1024);
std::cout << ll << "\n" << ull;
}
我在 Visual Studio 2019 年的输出是
-2147483648
18446744071562067968
不知道为什么会溢出,求助
在这两种情况下,计算都是使用整数完成的,因为右边的所有值都是整数文字。 2 * 1024 * 1024 * 1024
是 2,147,483,648
,它比最大 32 位 int 大 1,所以这部分计算溢出了。要修复,请使用 long long ll = 2LL * 1024 * 1024 * 1024;
进行第一次计算 long long,然后使用 unsigned long long ull = 2ULL * 1024 * 1024 * 1024;
进行第二次计算作为 unsigned long long
您可以在此处了解有关整数文字的更多信息:https://en.cppreference.com/w/cpp/language/integer_literal
固定代码如下:
#include <iostream>
#include <limits>
using namespace std;
int main()
{
long long ll = 2LL * 1024 * 1024 * 1024;
unsigned long long ull = 2ULL * 1024 * 1024 * 1024;
std::cout << ll << "\n" << ull;
}
我把这个固定代码的在线版本放在这里:
https://ideone.com/5QkEls
void main()
{
long long ll = 2 * 1024 * 1024 * 1024;
unsigned long long ull = (2 * 1024 * 1024 * 1024);
std::cout << ll << "\n" << ull;
}
我在 Visual Studio 2019 年的输出是
-2147483648
18446744071562067968
不知道为什么会溢出,求助
在这两种情况下,计算都是使用整数完成的,因为右边的所有值都是整数文字。 2 * 1024 * 1024 * 1024
是 2,147,483,648
,它比最大 32 位 int 大 1,所以这部分计算溢出了。要修复,请使用 long long ll = 2LL * 1024 * 1024 * 1024;
进行第一次计算 long long,然后使用 unsigned long long ull = 2ULL * 1024 * 1024 * 1024;
您可以在此处了解有关整数文字的更多信息:https://en.cppreference.com/w/cpp/language/integer_literal
固定代码如下:
#include <iostream>
#include <limits>
using namespace std;
int main()
{
long long ll = 2LL * 1024 * 1024 * 1024;
unsigned long long ull = 2ULL * 1024 * 1024 * 1024;
std::cout << ll << "\n" << ull;
}
我把这个固定代码的在线版本放在这里: https://ideone.com/5QkEls