整数データ型の範囲が有限であるほとんどのプログラミング言語では、正の数より負の数の方が常に 1 つ多くなります。
たとえば、C では、byte は -128~127 で、int は -2^31 から 2^31-1 までの範囲です。直観的には正の方が頻繁に発生するため、バイトが-127〜128ではない理由はありますか?
整数データ型の範囲が有限であるほとんどのプログラミング言語では、正の数より負の数の方が常に 1 つ多くなります。
たとえば、C では、byte は -128~127 で、int は -2^31 から 2^31-1 までの範囲です。直観的には正の方が頻繁に発生するため、バイトが-127〜128ではない理由はありますか?
最大の正は 0111 1111 = 127
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
最大の負のバイトは 1000 0000 = -128 です。
-128| 64 | 32 | 16 | 8 | 4 | 2 | 1 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
バイナリでは、MSB (Most Significant Bit - フロント ビット) は負の数を表すために予約されています。この概念は2 の補数と呼ばれ、2 進数 (基数 2) 表記で整数を表す方法としてほとんどのコンピューターで使用されます。
詳細については、バイナリ計算を調べてください
(これがあなたの質問に答えないことは知っていますが、あなたの質問の誤った仮定に対処しており、コメントとして残すには長すぎます。)
実際、C 標準では 1 バイトのサイズが定義されていません。
唯一安心できるのは、char
1キャラクターを保持できることです。
これまで、バイトは CPU に応じて 5 ~ 9 ビットの範囲でした。
その荒々しさのほとんどが落ち着き、現在のほとんどのシステムが 8 ビット バイトを使用しているのは事実です。
// What the C standard says must be true:
sizeof char <= sizeof int <= sizeof long
これが、多くの c99 以前 (および c99) のシステムに、次の非常に便利な typedef が含まれている理由です。
int8
uint8
int16
uint16
int32
uint32
整数データ型の範囲が有限であるほとんどのプログラミング言語では、正の数より負の数が常に 1 つ多くなります。
これは、ほとんど常に 2 の補数が使用されるためです。
2 の補数が非常に人気がある理由は、基本的にハードウェアの理由に帰着します。特に:
a - b = a + (~b + 1)
例 (4 ビットワード):
0110 - 0101 = 0110 + 1010 + 1 = 0110 + 1011 = 0001
(加算ステップは基本的に符号なし加算であることに注意してください。これらのステップでは符号ビットの特別な処理はありません)
基本的にハードウェアランドでは、初期キャリーを1に設定してアディションに変更a - b
できa + ~b + 1
ます。これは非常に便利なトリックです。減算には特別な注意は必要ありません。つまり、独自の回路は必要ありません。
2の補数表記だからです。符号ビットは、正の場合は 0、負の場合は 1 です。したがって、より簡単な例として 4 ビットを使用すると、次のようになります。
正: 0 は 0000、1 は 0001 など、7 として 0111 まで。
マイナス: -1 は 1111、-2 は 1110 など、-8 として 1000 まで。