【问题标题】:Strange overflow assigning 2 * 1024 * 1024 * 1024奇怪的溢出分配 2 * 1024 * 1024 * 1024
【发布时间】:2021-03-24 15:43:34
【问题描述】:
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

我不知道为什么会发生溢出,请帮忙

【问题讨论】:

  • main 应该返回 int
  • 在这两种情况下,您都将计算作为 int 并溢出。右手边的所有数字都是整数。试试std::cout &lt;&lt; 2 * 1024 * 1024 * 1024ull &lt;&lt; std::endl;
  • 提示:使用来自&lt;cstdint&gt;uint64_t ull 之类的东西,而不是unsigned long long long long plz be long ull 之类的疯狂,因为你不清楚你实际上会得到什么。

标签: c++ visual-studio c++11 overflow


【解决方案1】:

在这两种情况下,计算都是使用整数完成的,因为右边的所有值都是整数文字。 2 * 1024 * 1024 * 10242,147,483,648,其中 1 大于最大 32 位 int,因此这部分计算溢出。使用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

【讨论】:

  • LL 所以2LL * 1024 * 1024 * 1024 更有意义地引导乘法链。现在,即使 int 是 16 位,产品也是正确的。
猜你喜欢
  • 1970-01-01
  • 2014-09-20
  • 2013-12-28
  • 2014-08-31
  • 2012-08-15
  • 1970-01-01
  • 2020-05-06
  • 2012-09-18
  • 2015-02-16
相关资源
最近更新 更多