このことを考慮:
1. printf(“%d”, sizeof(32767));
2. printf(“%d”, sizeof(-32767));
3. printf(“%d”, sizeof(-32768));
1 と 2 の結果は 2 でしたが、3 番目のステートメントの結果は 4 でした。ただし、の範囲はint
-32768 ~ 32767 です。3 番目のステートメントだけで違いがあるのはなぜですか? 誰でもこれを説明できますか?
私のコンパイラのサイズint
は2です。
値-32768
は、言語では単一の項目とは見なされず、符号と値の2つの部分で構成されます。
上限が32767の場合、値32768
をanにすることはできません。したがって、のように、より大きなタイプであると判断されます。その後にのみ、サインが適用されます。int
long
-
コンパイラはこれを定数 32768 に適用されたものとして読み取ります。32768 はint
(この特定のコンパイラでは) の範囲外であるため、 に昇格されますlong
。
実際、標準ヘッダーの多くの実装では、たとえば、この問題を回避するために定義INT_MIN
されています。(-32767-1)
整数定数はデフォルトですが、必要に応じて( に収まらない場合)、int
それらを保持するのに十分な大きさの最小サイズに昇格されます(例:)。long
int
anint
が 16 ビットの場合、(2 の補数の場合) 理論上の最大範囲は -32768 ~ +32767 です。ただし、実際には、abs()
(16 ビットの場合) の有効な値を返すことが不可能であるため、これは次のような問題を引き起こしますabs(-32768)
。コンパイラは、INT_MIN
代わりに -32767 に設定することで問題を回避できます。abs()
のすべての有効な値に対して正しく動作し、予想外に顔が爆発することはありint
ません (例: abs(-32768) = -32768
)。
これの最終結果は、理論的には 16 ビットに収まる整数定数 -32768int
が に昇格される可能性があるlong
ということですINT_MIN
。