0

我遇到了一个奇怪的错误,其中乘法给出了错误的结果。下面是一个简化版本,它在我的系统上给出了相同的结果。

#include <stdio.h>

int main() {
   printf("%u\n", 1111111111U*10U);
}

我在 OpenSUSE 12.2(3.4.11-2.16-default x86_64)上使用 GCC 4.7.1 进行编译,这给了我以下输出:

2521176518
4

3 回答 3

3

10 * 11 亿超出了系统上 unsigned int 的范围,因此您会看到溢出的结果。

在 32 位系统上,unsigned int 可以容纳的最大值是 4294967295(42.9 亿)。

于 2013-01-10T19:20:12.303 回答
2

让我猜猜……您的实现使用 32 位unsigned值,对吗?

unsigned如果是这样的话,算术是以 2^32 为模完成的。

于 2013-01-10T19:21:05.213 回答
0

整数通常表示为二进制补码。在 32 位机器上,最大有符号整数是+2147483647/-2147483648或 unsigned +4294967295

当您乘以 时1,111,111,111 * 10,您会得到11,111,111,110,它大于最大可能的无符号整数。从而溢出

使用二进制表示,这是

1000010001110100011010111000111 * 1010 = 1010010110010001100001100111000110

最少的 32 位是10010110010001100001100111000110,即2521176518十进制。

于 2013-01-10T19:23:35.380 回答