【问题标题】:Why does C++ programs return a code instead of the answer when it's too big? [duplicate]为什么 C++ 程序在太大时返回代码而不是答案? [复制]
【发布时间】:2020-06-28 04:14:29
【问题描述】:

我正在编写一个 C++ 程序来计算一个数学问题。我先写:

int x = 1
int y = 1
int z = 1
int answer = x * y * z
cout << answer << endl;

当我构建并运行它时,它会打印 1。但是当我这样做时:

   int x = 1234;
    int y = 5243;
    int z = 1142;
    int answer =  x * y * z;
    cout << answer << endl ;

它会打印出一个答案,即 7388502404,但我不明白的代码是:“-1201352188”。 你能解释一下为什么会出现这个代码,以及如何解决这个代码吗?

【问题讨论】:

  • 通常int 最多只能容纳大约 22 亿的数字。通过之后,事情就会得到...weird
  • 在这种情况下你得到 7,388,582,404,太大了。但是,如果您将其视为十六进制数,则会得到 1 B8 64 D2 04。通常的行为是 B8 64 D2 04 位于 32 位整数中,而 1 消失在以太中。转换回十进制表示法,你得到 -1201352188。这是有符号整数通常会发生的情况,但由 C++ 下的任何内容来决定实际发生的情况。
  • 关于副本的注释:正在使用较小的类型,但结果是相同的,答案涵盖了正在发生的事情。
  • 1234*5243*1142 的结果超过了int 在您的平台上可以表示的最大值(标准只保证int 最多可以表示32767,尽管它看起来是您的编译器有一个 32 位的 int 可以代表大约 2147483647) 所以你会溢出。形式上,有符号整数类型的溢出是未定义的行为(尽管在未来的标准中可能会改变)。一个典型的结果(标准不保证)是一个与您预期的非常不同的值(在您的情况下是一个很大的负数),例如截断结果以适合int
  • 如果你想确定为你的数字设置最大尺寸,也可以考虑这个链接:stackoverflow.com/a/6462474/12861639

标签: c++


【解决方案1】:

这不是代码,它是存储在整数结果中的值。您遇到整数溢出。 int 只能保存特定大小的值,当您超过该大小时,您最终会得到不是您想要的但仍可存储在 int 中的位模式。有时这些位模式是负数的整数表示,这就是这里发生的情况。

您可以考虑使用更大的整数类型,例如longlong long

【讨论】:

  • 请注意,您需要在整个过程中使用更大的数据类型。如果乘以 3 ints,则乘法将作为 int 完成,并且会在存储到更大的类型之前溢出。
  • @user4581301 这实际上不是真的。当您执行long * intint * long 时,int 实际上会被转换为long 并使其成为long * long。但是,您确实可能希望手动强制转换它们,甚至将它们声明为相同的类型,以消除任何意外行为
  • 另一种可能性是使用一些arbitrary precision arithmetic 库,例如GMPlib
  • @Ranoiaetep 你说的是真的,但这并不意味着我的陈述不真实。将三个ints 相乘,您将得到一个int。他们是规则。将其中一个或多个ints 更改为long,您将获得您所描述的行为,但您已经从根本上更改了参数。
  • @user4581301 对不起,这是我的错,我以为你的意思是 int(3) * long(num) 出于某种原因
猜你喜欢
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 2017-03-02
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多