首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sra(右移算术)与srl (逻辑右移)

sra(右移算术)与srl (逻辑右移)
EN

Stack Overflow用户
提问于 2011-06-08 01:41:53
回答 2查看 36.7K关注 0票数 5

请看这两段伪汇编代码:

1)

代码语言:javascript
复制
li $t0,53

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

print $t1  
print $t2  
print $t3  

2)

代码语言:javascript
复制
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)吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-08 01:55:36

代码语言:javascript
复制
-53 = 1111111111001011

           sra 2

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

因为对于正结果和负结果,额外的位都会被丢弃,所以如果您将移位视为除法,则结果总是向下舍入。

代码语言:javascript
复制
 53 sra 2 = floor( 53 / 2^2) = floor( 13.25) =  13
-53 sra 2 = floor(-53 / 2^2) = floor(-13.25) = -14
票数 4
EN

Stack Overflow用户

发布于 2011-06-08 02:04:06

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

在32位x86上,这意味着:

代码语言:javascript
复制
 53 = 00000000000000000000000000110101
-53 = 11111111111111111111111111001011

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

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

我想要认识到的是,在二的补码中,数字的负数不是数字中每一位的反转--它是每一位的反转,然后是该数字的1的加法。考虑一下:

代码语言:javascript
复制
 1 = 0000001
-1 = 1111111

不是:

代码语言:javascript
复制
-1 = 1111110

这将导致:

代码语言:javascript
复制
 0 = -1 + 1 = 11111111

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6269399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档