ご存知のように、最小の整数はコンパイラによって異なります。そのため、次の質問があります。さまざまなコンパイラを使用した場合、(int)-2147483648
除算の結果はどうなりますか? (int)-1
たとえば、VC6.0、VS2010 など?
1 に答える
まず、値が と同じ32-bit
である 2 の補数表現を持つシステムにいると仮定しましょう。INT_MIN
-INT_MAX - 1
この式:
(int) -2147483648 / (int) -1
と同等です
(int) -2147483648 / -1
そのまま-1
のタイプint
です。
が である32-bit
2 の補数システムでINT_MAX
は2147483647
、値2147483648
はlong
1)で表すことができないため、型int
です。の値-2147483648
も型long
です。
long
値-2147483648
は で表すことができint
、 の整数変換後の値は(int) -2147483648
ですINT_MIN
。
元の式は、(私たちの仮定の下で) 以下と同等です。
INT_MIN / -1
INT_MAX + 1
この式は、 で表現できないと同等int
です。実際int
、型の範囲は からINT_MIN
までINT_MAX
です。式は整数オーバーフローであり、整数オーバーフローは C で未定義の動作を引き起こします。
(C99、6.5p5) 「式の評価中に例外的な条件が発生した場合 (つまり、結果が数学的に定義されていないか、その型の表現可能な値の範囲内にない場合)、動作は未定義です。」
1) 暗黙的にLONG_MAX
が であると仮定します。> INT_MAX
それ以外の場合、値2147483648
の型はlong long
です。