我遇到了一个奇怪的错误,其中乘法给出了错误的结果。下面是一个简化版本,它在我的系统上给出了相同的结果。
#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
答案 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
十进制。