【发布时间】:2021-04-02 08:34:50
【问题描述】:
我有这段代码,两次计算给出了不同的结果。
第一个溢出,第二个只停留在 2^31-1。
我不知道为什么。
int n4, n5;
n4 = pow(2, 31);
n4 = n4 + n4;
n5 = pow(2, 31) + pow(2, 31);
printf("\nn4: %d, n5: %d",n4,n5);
/* n4: -2, n5: 2147483647 */
【问题讨论】:
-
有符号整数算术溢出导致未定义行为。在大多数系统上,
int是 32 位宽(并且始终是有符号的)。在二进制补码系统上,它最多可以达到(2^31)-1。 -
在不相关的注释中,请养成在
printf调用中使用trailing 换行符的习惯。如果连接到终端或控制台窗口,则输出到stdout(其中printfrites)被缓冲行,这意味着输出实际上是一个换行符。通过打印前导换行符,您可以编写 previous 行而不是当前行。最后输出和命令行提示符之间不会有换行符。 -
看到下面 Allan Wind 的答案,我建议您关注到底是什么让您感到困惑。猜测一下,您确信做同样的事情(将 2 添加到自身的 31 的幂)并得到不同的结果。或者,当将其添加到自身时,您会发现结果为负 1 很奇怪。专注于您真正想知道的内容,减少有助于回答所需的猜测。
标签: c integer-overflow