我遇到了一个奇怪的错误,其中乘法给出了错误的结果。下面是一个简化版本,它在我的系统上给出了相同的结果。
#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
我遇到了一个奇怪的错误,其中乘法给出了错误的结果。下面是一个简化版本,它在我的系统上给出了相同的结果。
#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
10 * 11 亿超出了系统上 unsigned int 的范围,因此您会看到溢出的结果。
在 32 位系统上,unsigned int 可以容纳的最大值是 4294967295(42.9 亿)。
让我猜猜……您的实现使用 32 位unsigned
值,对吗?
unsigned
如果是这样的话,算术是以 2^32 为模完成的。
整数通常表示为二进制补码。在 32 位机器上,最大有符号整数是+2147483647/-2147483648
或 unsigned +4294967295
。
当您乘以 时1,111,111,111 * 10
,您会得到11,111,111,110
,它大于最大可能的无符号整数。从而溢出。
使用二进制表示,这是
1000010001110100011010111000111 * 1010 = 1010010110010001100001100111000110
最少的 32 位是10010110010001100001100111000110
,即2521176518
十进制。