3

このことを考慮:

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です。

4

3 に答える 3

6

-32768は、言語では単一の項目とは見なされず、符号と値の2つの部分で構成されます。

上限が32767の場合、値32768をanにすることはできません。したがって、のように、より大きなタイプであると判断されます。その後にのみ、サインが適用されます。intlong

于 2012-05-19T09:23:59.123 に答える
3

-コンパイラはこれを定数 32768 に適用されたものとして読み取ります。32768 はint(この特定のコンパイラでは) の範囲外であるため、 に昇格されますlong

実際、標準ヘッダーの多くの実装では、たとえば、この問題を回避するために定義INT_MINされています。(-32767-1)

于 2012-05-19T09:27:16.260 に答える
1

整数定数はデフォルトですが、必要に応じて( に収まらない場合)、intそれらを保持するのに十分な大きさの最小サイズに昇格されます(例:)。longint

anintが 16 ビットの場合、(2 の補数の場合) 理論上の最大範囲は -32768 ~ +32767 です。ただし、実際には、abs()(16 ビットの場合) の有効な値を返すことが不可能であるため、これは次のような問題を引き起こしますabs(-32768)。コンパイラは、INT_MIN代わりに -32767 に設定することで問題を回避できます。abs()のすべての有効な値に対して正しく動作し、予想外に顔が爆発することはありintません (例: abs(-32768) = -32768)。

これの最終結果は、理論的には 16 ビットに収まる整数定数 -32768intが に昇格される可能性があるlongということですINT_MIN

于 2012-05-19T09:36:03.263 に答える