【发布时间】: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++