【问题标题】:unexpected results of division and Modulus in c++c++中除法和模数的意外结果
【发布时间】:2020-03-05 10:39:06
【问题描述】:

为什么 990099009900 / 10 在 c++ 中等于 -203843547?

#include <iostream>
using namespace std;
int main()
{
    long int n = 990099009900;
    cout << n / 10;
}

【问题讨论】:

  • 我也没有。这真的是你测试的代码吗?
  • 在 Windows 上,long 始终为 32 位。使用long longint64_t
  • @idclev463035818 WandBox 使用 g++,其中 x64 上的 long 有 64 位。
  • long int 被定义为具有 至少 32 位,并且从那时起,只有 -2,147,483,648 到 2,147,483,647 的保证范围(它可能有更多,但只能保证该范围)。 990099009900 超出该范围。

标签: c++ operators


【解决方案1】:

如果你在这里运行:

std::cout << "limit " << std::numeric_limits<long int>::max();

您可能会收到2147483647,就像它在 Visual Studio 上发生的情况一样。改用long long

#include <iostream>
int main()
{
    long long n = 990099009900;
    std::cout << n / 10;
}

guaranteed 至少是 64 位,而 long int 不是(至少是 32 位)。 32 位不足以容纳 990099009900

【讨论】:

    【解决方案2】:

    您需要使用long long 来表示该大小的数字,以便您的代码可移植。

    您使用的系统中您的LONG_MAX(即std::numeric_limits&lt;long&gt;::max())小于990099009900。

    这种灵活性有其缺点,这也是为什么要引入像std::int64_t 这样的固定宽度类型的原因之一。

    另一种方法是使用

    auto n = 990099009900;
    

    并让编译器弄清楚,虽然如果你接近类型的限制,这可能会导致问题,并且你增加n

    【讨论】:

      猜你喜欢
      • 2015-12-25
      • 1970-01-01
      • 2022-01-05
      • 2021-12-20
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多