sra(算术右移)与 srl(逻辑右移)
请看一下这两段伪汇编代码:
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) 吗?
Please take a look at these two pieces of pseudo-assembly code:
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
in the first case the output is:
212
13
13
in the latter is:
-212
107374...
-14
But shouldn't : sra (-53) = - (srl 53) ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
由于对于正结果和负结果都会简单地删除额外的位,因此如果将移位视为除法,则结果始终向下舍入。
Because the extra bits are simply dropped for both positive and negative results, the result is always rounded down if you view the shift as a division.
答案与二进制补码表示法有关。
sra
的目的是支持以二进制补码表示的负数。当以“算术”方式右移时,最高有效位(如果值为负则为 1)会被复制。在你的 32 位 x86 上,这意味着:
我想要认识到的是,在二进制补码中,数字的负数并不是数字中每个位的反转 - 它是每个位的反转,然后在该数字上加 1。考虑:
不:
这会导致:
换句话说,二进制补码中不存在“负零”。零占据了该域中的空间,否则被视为“正号”,因为高位为零。
The answer relates to two's complement notation. The purpose of
sra
is to support negative numbers represented in two's complement. The most significant bit, which is one if the value is negative, is duplicated when shifted right in the "arithmetic" fashion.On your 32-bit x86, this means that:
I suppose the thing to realize is that in two's complement, the negative of a number is not the inversion of every bit in the number -- it is the inversion of every bit, then the addition of 1 to that number. Consider:
Not:
Which would lead to:
In other words, there is no "negative zero" in two's complement. Zero takes up space in the realm otherwise considered "positive sign" because the high bit is zero.