sarq和shrq之间的区别

名称:值

%rdi:0x6

%rax:0x4

sarq和shrq有什么区别?

如果我有sarq $ 1,%rdi这个值看起来如何? shrq%rdi是做什么的?

ZQW110 回答:sarq和shrq之间的区别

sarq是四字的算术右移,而shrq是四字的逻辑右移。区别在于算术移位将用最左边的位(即符号位)填充空位,而逻辑右移位将只用0填充空位。

对于正数,它们的行为是相同的。对于负数,它们的行为完全不同。

例如,假设%rax = 16 (0x0000 0000 0000 0010)sar $4,%raxshrq $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;
}
本文链接:https://www.f2er.com/3155218.html

大家都在问