名称:值
%rdi:0x6
%rax:0x4
sarq和shrq有什么区别?
如果我有sarq $ 1,%rdi这个值看起来如何? shrq%rdi是做什么的?
sarq
是四字的算术右移,而shrq
是四字的逻辑右移。区别在于算术移位将用最左边的位(即符号位)填充空位,而逻辑右移位将只用0填充空位。
对于正数,它们的行为是相同的。对于负数,它们的行为完全不同。
例如,假设%rax = 16 (0x0000 0000 0000 0010)
。 sar $4,%rax
和shrq $4,%rax
都将%rax
设置为1(0x0000 0000 0000 0001
)。
现在为%rax = -16 (0xffff ffff ffff fff0)
。 sar $4,%rax
会将%rax
设置为-1(0xffff ffff ffff ffff
),而shr $4,%rax
会将%rax
设置为1152921504606846975(0x0fff ffff ffff ffff
)。
要使用哪种指令取决于数据类型和要执行的操作。 C >>
运算符将sar
用于带符号的数据类型,将shr
用于无符号的数据类型。
区别在于sarq适用于有符号整数,shrq适用于无符号整数。基本上,如果设置了整数的最高位,则sarq将移位1(否则为零)。 shrq只会移位零。您可以通过一些简单的C轻松查看它们的作用。
int main()
{
int val = -4;
// signed arithmetic shift
int rval = val >> 1;
// will print -2
std::cout << rval << std::endl;
unsigned uval = -4;
// unsigned logical shift
unsigned ruval = uval >> 1;
// will print 0x7FFFFFFE
std::cout << rval << std::endl;
return 0;
}