掛け算が間違った結果をもたらすという奇妙なバグに遭遇しました。以下は、私のシステムで同じ結果をもたらす簡略化されたバージョンです。
#include <stdio.h>
int main() {
printf("%u\n", 1111111111U*10U);
}
OpenSUSE 12.2(3.4.11-2.16-デフォルトの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-デフォルトのx86_64)でGCC 4.7.1をコンパイルしていますが、次の出力が得られます。
2521176518
10 * 11億は、システム上のunsigned intの範囲を超えているため、オーバーフローした結果が表示されます。
32ビットシステムでは、unsigned intが保持できる最大値は4294967295(42.9億)です。
推測させてください...あなたの実装は32ビットunsigned
値を使用していますよね?
unsigned
その場合、算術演算は2^32を法として行われます。
整数は通常、2の補数として表されます。32ビットマシンでは、最大符号付き整数は+2147483647/-2147483648
または符号なし+4294967295
です。
を乗算1,111,111,111 * 10
すると、が得られます11,111,111,110
。これは、可能な最大の符号なし整数よりも大きくなります。したがって、オーバーフロー。
バイナリ表現では、これは
1000010001110100011010111000111 * 1010 = 1010010110010001100001100111000110
少なくとも32ビット10010110010001100001100111000110
は2521176518
10進数のです。