0


0

符号付きバイトの16進数へのバイナリ変換に関する質問

1)2進数を10進数に変換するとき、左端のビットは0、1 …​を表すことを理解しています。 たとえば、0001を10進数に変換する場合、0 * 2 ^ 0 + 0 * 2 ^ 1 + 0 * 2 ^ 2 + 1 * 2 ^ 3であるため、10進数値は8になります。

2)たとえば、バイナリ1000 0000に変換される16進数0x80に署名した場合、このバイナリ表現の10進数値を計算するために署名されるため、7ビットを反転して1111111を取得し、1を追加する必要がありますこれにより、10000000、つまり-128が得られます。

私の質問は、符号付きバイトの10進数を計算する2番目のケースで、右端のビットから0として開始する必要があるため、 …​.+1*2^8. Why isn’t the 2^0 the left most bit as we computed in 1) for 2番目のケース?

ありがとう。

2 Answer


4


いいえ、通常、バイナリは他の方法で記述されています…​ 0001は1、1000は8です。


2


私はポイント1に答えますが、まったくそうではありません。 「0001」は実際には「1」ですが、「1000」は「8」です。 あなたは間違った目的から来ているようです。 たとえば、2進数の「1101」は次のようになります。

+------ 1 * 2^3     =  8
|+----- 1 * 2^2     =  4
||+---- 0 * 2^1     =  0
|||+--- 1 * 2^0     =  1
||||                  --
1101                = 13

ポイント2の場合、ビットパターンを符号付き数値に変換する最も簡単な方法は、最初にそれを_unsigned_値( 0x80 = 128)に変換し、次にバイアスを減算する(8ビットで256、16ビットで65536など) )-128を取得します。

バイアスはプロセスの最後でのみ計算に影響するはずです。これは、範囲「0..255」を「-128..127」に、または「0..65535」を「-32768..32767」にマッピングする方法です`。