5

次の2つの疑似アセンブリコードを見てください。

1)

li $t0,53

sll $t1,$t0,2
srl $t2,$t0,2
sra $t3,$t0,2

print $t1  
print $t2  
print $t3  

2)

li $t0,-53


sll $t1,$t0,2
srl $t2,$t0,2
sra $t3,$t0,2

print $t1
print $t2
print $t3

最初の場合、出力は次のようになります
。212
13
13

後者の場合:
-212
107374 ...
-14
しかし、すべきではありません:sra(-53)=-(srl 53)?

4

2 に答える 2

4
-53 = 1111111111001011

           sra 2

      1111111111110010(11) = -14
       ^^              ^^
      sign           dropped
    extension

余分なビットは正の結果と負の結果の両方で単純に削除されるため、シフトを除算として表示すると、結果は常に切り捨てられます。

 53 sra 2 = floor( 53 / 2^2) = floor( 13.25) =  13
-53 sra 2 = floor(-53 / 2^2) = floor(-13.25) = -14
于 2011-06-07T17:55:35.620 に答える
2

答えは、2 の補数表記に関するものです。の目的はsra、2 の補数で表される負の数をサポートすることです。値が負の場合は 1 である最上位ビットは、「算術」方式で右にシフトされると複製されます。

32 ビット x86 では、これは次のことを意味します。

 53 = 00000000000000000000000000110101
-53 = 11111111111111111111111111001011

 srl( 53, 2) =  13 = 00000000000000000000000000001101
               -13 = 11111111111111111111111111110011

 sra(-53, 2) = -14 = 11111111111111111111111111110010

理解すべきことは、2 の補数では、数値の負の値は数値のすべてのビットの反転ではなく、すべてのビットの反転であり、その数値に 1 を加えたものであるということです。検討:

 1 = 0000001
-1 = 1111111

いいえ:

-1 = 1111110

これは次のことにつながります。

 0 = -1 + 1 = 11111111

つまり、2 の補数には「負のゼロ」はありません。ゼロは、上位ビットがゼロであるため、そうでなければ「正符号」と見なされる領域内のスペースを占有します。

于 2011-06-07T18:04:05.873 に答える