奇怪的bug,同时在C中将无符号整数乘以10

时间:2013-01-10 19:17:26

标签: c gcc multiplication

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

#include <stdio.h>

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

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

2521176518

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

让我猜一下......你的实现使用32位unsigned值,对吗?

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

答案 2 :(得分:0)

整数通常表示为two's complement。在32位计算机上,最大有符号整数为+2147483647/-2147483648或无符号+4294967295

当你乘以1,111,111,111 * 10时,你会得到11,111,111,110,它大于最大可能的无符号整数。因此overflow

使用二进制表示,这是

1000010001110100011010111000111 * 1010 = 1010010110010001100001100111000110

至少32位为10010110010001100001100111000110,即2521176518十进制。