0

掛け算が間違った結果をもたらすという奇妙なバグに遭遇しました。以下は、私のシステムで同じ結果をもたらす簡略化されたバージョンです。

#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
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

整数は通常、2の補数として表されます。32ビットマシンでは、最大符号付き整数は+2147483647/-2147483648または符号なし+4294967295です。

を乗算1,111,111,111 * 10すると、が得られます11,111,111,110。これは、可能な最大の符号なし整数よりも大きくなります。したがって、オーバーフロー

バイナリ表現では、これは

1000010001110100011010111000111 * 1010 = 1010010110010001100001100111000110

少なくとも32ビット10010110010001100001100111000110252117651810進数のです。

于 2013-01-10T19:23:35.380 に答える