5

请看这两条伪汇编代码:

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

答案与二进制补码表示法有关。的目的sra是支持以二进制补码表示的负数。当以“算术”方式右移时,最高有效位(如果值为负数为 1)被复制。

在您的 32 位 x86 上,这意味着:

 53 = 00000000000000000000000000110101
-53 = 11111111111111111111111111001011

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

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

我想要意识到的是,在二进制补码中,数字的负数不是数字中每一位的反转——它是每一位的反转,然后在该数字上加 1。考虑:

 1 = 0000001
-1 = 1111111

不是:

-1 = 1111110

这将导致:

 0 = -1 + 1 = 11111111

换句话说,二进制补码中没有“负零”。零在领域中占据空间,否则被认为是“正号”,因为高位为零。

于 2011-06-07T18:04:05.873 回答