【问题标题】:The long long int is not supporting the multiplication of larger number [duplicate]long long int 不支持大数的乘法[重复]
【发布时间】:2020-10-14 14:09:55
【问题描述】:

我正在尝试执行一个简单的长乘法,但它没有显示正确的输出。 这是示例代码

'''
#include<iostream>
using namespace std;
int main ()
{
    long long int c=100000*90000;
    cout<<c;
    return 0;
}
'''

变量c的cout是:41006540​​8

我不知道为什么它显示的是垃圾值而不是 9000000000。

【问题讨论】:

  • 这段代码是将两个int相乘,得到一个int,然后再转成long long
  • 即我不认为你尝试过100000LL*90000LL 或类似的?
  • 启用警告以捕获此问题。即使没有警告,现代编译器也会warn

标签: c++


【解决方案1】:

在具有 32 位 int10000090000 的平台上是 int 类型(请注意,在具有 16 位 int 的平台上,它们将是 long 类型和类似的分析我在这里介绍的内容适用于 32 位 long。)

因此,您将两个 int 类型相乘。您正在溢出int,结果未定义,尽管 9000000000 - 41006540​​8 是 232 的倍数并非巧合(但不要依赖它,因为它只不过是未定义的表现形式行为)。

100000LL * 90000

是一个修复。

【讨论】:

  • 基本上我已经生成了随机数(可以长到 100000)来填充数组并计算最大的成对乘积。
【解决方案2】:

100000 的类型是(可能是 1int(在您的系统上)。 90000 的类型(可能)是 int(在您的系统上)。您将两个 int 对象相乘。 int 保证代表最多 32'767 的数字。在现代 x86 系统上,它最多可以表示 2'147'483'647。这些最大值小于 9'000'000'000。因此,程序的行为是未定义的。

您使用此溢出的int 初始化long long 的事实与结果无关。您必须对 long long 对象执行乘法运算才能获得 64 位(至少)乘法。


1 假设这些数字在您的系统上可以表示为int,它在现代 x86 系统上。在某些系统上可能是long

【讨论】:

  • @FrançoisAndrieux:我仍然坚持我的猜想,即在我撰写本文时,大多数运行 C 和 C++ 程序的系统都有 16 位 int 类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多