奇怪的溢出赋值 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 * 10242,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