-2

ご存知のように、最小の整数はコンパイラによって異なります。そのため、次の質問があります。さまざまなコンパイラを使用した場合、(int)-2147483648除算の結果はどうなりますか? (int)-1たとえば、VC6.0、VS2010 など?

4

1 に答える 1

1

まず、値が と同じ32-bitである 2 の補数表現を持つシステムにいると仮定しましょう。INT_MIN-INT_MAX - 1

この式:

(int) -2147483648 / (int) -1

と同等です

(int) -2147483648 / -1

そのまま-1のタイプintです。

が である32-bit2 の補数システムでINT_MAX2147483647、値2147483648long1)で表すことができないため、型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です。

于 2012-12-28T16:36:47.833 に答える