2の補数形式を想定して、-64 (hex)
との間の値を格納するために必要なプロセッサの最小レジスタ長はどれくらいですか?128 (hex)
8ビットレジスタの2の補数が0から255になるので、私は8ビットレジスタを考えていました。
私は正しいですか?
2の補数形式を想定して、-64 (hex)
との間の値を格納するために必要なプロセッサの最小レジスタ長はどれくらいですか?128 (hex)
8ビットレジスタの2の補数が0から255になるので、私は8ビットレジスタを考えていました。
私は正しいですか?
最大 128 (10 進) だけでも不正解です。2 の補数を使用しているため、実際の範囲は -(2 N-1 ) から +(2 N-1 - 1) で、N はビット数です。したがって、8 ビットの範囲は -128 から 127 (10 進数) になります。
実際には -64 (16 進数) から 128 (16 進数) として提示するので、実際には -100 (10 進数) から 296 (10 進数) を見ています。ビットを追加すると、範囲が最大 -256 から 255 に増加し、最後の追加で -512 から 511 になります。必要な量を10 ビットとして作成します。
ここで、-64 から 128 (10 進数) を扱っていないことを確認してください。先に指摘したように、8 ビットの範囲は 127 までしかないため、慎重でない場合は非常に難しい質問になります。その場合、9 ビットになります。
おそらく、あなたは間違った用語を使用しています。0x64 と 0x128 が 16 進値として使用されることはほとんどありません。そして、これらの値を意味する場合、明らかに、8 ビットでその大きな範囲を格納することはできません。0x128 - (-0x64) = 0x18C 保存するには少なくとも 9 ビットが必要
OTOH 64 と 128 は、2 の累乗であるため、非常に一般的な値です。一般的な 2 の補数エンコーディングを使用すると、9 ビットのコストがかかり (128 は 8 ビットの 2 の補数範囲外であるため)、多くの未使用の値が無駄になります。しかし、実際には 9 ビット システムはほとんどないため、16 ビット ショートを使用する必要があります。したがって、メモリを節約したい場合、唯一の方法は独自の encoding を使用することです。
storageの値のみが必要な場合は、ほぼすべてのエンコーディングが適切です。たとえば、int8_t
-64 から 127 を通常として使用し、128 (-128、-65...任意の数値) の特殊なケース、またはuint8_t
0 から 192 を使用して、値を直線的にマッピングします。ロード/ストア時に正しい値との間で変換するだけです。操作は 8 ビットよりも幅の広い型で実行する必要がありますが、ディスク上のサイズは 8 ビットのみです。
計算に値が必要な場合は、さらに注意が必要です。たとえば、バイナリ 0 が-64を表し、192 が 128 を表したり、通常a
はa - 64
. 各計算の後、正しい表現のために値を再調整する必要があります。たとえば、A と B が and として格納されa
ている場合、それぞれb
がandとして実行されます(64 を予想より 1 だけ減算したため)。A - 64
B - 64
A + B
a + b + 64
2 の補数では、8 ビット レジスタの範囲は -128 ~ +127 です。上限を取得するには、下位 7 ビットを 1 で埋めます。01111111 は 10 進数で 127 です。下限を取得するには、最上位ビットを 1 に設定し、残りを 0 に設定します。10000000 は 2 の補数で -128 です。
これらの 16 進数の値は少し奇妙に見えます ( 10 進数では 2 のべき乗です) が、いずれにせよ: 0x128 (0x は 16 進数の標準プレフィックスです) は大きさが大きい数値であり、そのバイナリ表現は 100101000 です。符号ビットの後の9 ビットを表すことができる必要があります。したがって、2 の補数を使用できるようにするには、少なくとも 10 ビットが必要です。