16ビットCコンパイラでは、整数を格納するために2バイト、文字を格納するために1バイトがあります。符号なし整数の場合、範囲は0〜65535です。符号付き整数の場合、範囲は-32768〜32767です。符号なし整数の場合、0〜255です。整数型によると、符号付き文字の範囲は-128〜127のようにしないでください。なぜ-127から127?残りの1ビットはどうですか?
1 に答える
私はあなたが2つのことを混ぜていると思います:
- 規格が要求する
signed char
範囲などint
。 - 最近のほとんどのハードウェアに実装されている範囲。
実装された範囲が標準で要求される範囲のスーパーセットである限り、これらは必ずしも同じである必要はありません。
C標準によれば、SCHAR_MIN
およびの実装定義値は、次の値SCHAR_MAX
と同じかそれ以上の大きさ(絶対値)である必要があります。
SCHAR_MIN -127
SCHAR_MAX +127
つまり、 256ではなく255の値のみです。
ただし、準拠実装によって定義された制限は、これらよりも「大きく」なる可能性があります。つまり[-128,+127]
、標準でも許可されています。また、ほとんどのマシンは2の補数形式で数値を表すため、[-128,+127]
これが最も頻繁に表示される範囲です。
実際、C規格で定義されている最小範囲でさえ、ゼロに関して対称です。それは:int
INT_MIN -32767
INT_MAX +32767
つまり、 65536ではなく、65535の値のみです。
しかし、繰り返しになりますが、ほとんどのマシンは2の補数表現を使用します。これは、範囲を提供することを意味します[-32768,+32767]
。
2の補数形式では、256個の符号付き数値を8ビット(つまり[-128,+127]
)で表すことができますが、これができない他の符号付き数値表現もあります。
符号の大きさの表現では、1ビットが符号用に予約されているため、次のようになります。
00000000
10000000
どちらも同じことを意味します。つまり、0
(または、+0
と-0
)です。
これは、1つの値が無駄になることを意味します。したがって、符号の大きさの表現は、8ビットで-127( 11111111
)から+127()までの値しか保持できません。01111111
1の補数表現(ビット単位のNOTを実行して否定):
00000000
11111111
どちらも同じことを意味し0
ます。
ここでも、-127(10000000
)から+127()までの値のみ01111111
を8ビットで表すことができます。
C標準で範囲をである必要がある場合、[-128,+127]
これは基本的に、そのような表現を使用するマシンがCプログラムを効率的に実行できるようにすることを除外します。この範囲を表すために追加のビットが必要になるため、8ではなく符号付き文字を格納するために9ビットが必要になります。上記に基づく論理的な結論は次のとおりです。これが、C標準[-127,+127]
で符号付き文字が必要な理由です。つまり、実装がニーズに合った整数表現の形式を自由に選択できるようにすると同時に、効率的な方法で標準に準拠できるようにします。同じ論理が同様に適用さint
れます。