1

のように、16 ビットの符号付き数値を 32 ビット レジスタに符号拡張する例を見てみましょうmov $+/-5, %ax movswl %ax, %ebx

次の 2 つのケースが考えられます。

  1. 上位ビットはゼロです (数字は正です)。これは非常に理解しやすく直感的です。たとえば、数字がある場合5、左にゼロを埋め込むことは非常に理解しやすいです。例えば:

                      00000000 00000101    # 5 (represented in 16 bits)
    00000000 00000000 00000000 00000101    # 5 (represented in 32 bits)
    
    
  2. ただし、理解するのが難しいのは、それが負の数であり、符号拡張する場合です。例:

                      11111111 11111011    # -5 (represented in 16 bits)
    11111111 11111111 11111111 11111011    # -5 (represented in 32 bits)
    

はい、上位ビットを で埋めるだけであることはわかってい1ます。しかし、何がそれを機能させるのでしょうか? おそらく、2進数の「プロパティ」がそれを可能にするものについての一種の説明は、これをよりよく理解するのに役立つでしょう.

4

1 に答える 1

4

n ビットの 2 の補数の場合:

  • 上位ビット (符号ビット) にはプレース値があります-(2^n)
  • 2 番目に高いビットには位の値2^(n-1)があり、以下同様 (通常の 2 進数の位の値)

1 ビット拡張すると、元の符号ビットは「通常の」ビットになり、桁の値が+(2^n)ではなく に-(2^n)なるため、既存のビットで表される値2^n + 2^n = 2^(n+1)は元の値より高くなります。(または、そのビットがゼロの場合も同じです)。

新しい符号ビットの桁の値は-(2^(n+1))であるため、元の符号ビットをコピーすることは、桁の値の変化のバランスを取るために必要なことです。(または、ゼロの場合は変更しません)。

もちろん、1ビットの手順は、任意のビット数の繰り返しによって一般化されます。


ビットが値を表す方法の詳細については、ウィキペディアを参照してくださいビットが動作します。

4 ビットから 5 ビットへの符号拡張など、いくつかの小さな例について、紙の上で試すこともできます。 -1(all-ones) は、計算を簡単にするため、最初は適切な値です。または0b1000(-8) も良い選択です。

Google が見つけたhttps://andybargh.com/binary-sign-extension/は、1 つの 8 ビットの例で機能します。

于 2020-10-11T07:14:25.637 に答える