sarq 和 shrq 的区别

Difference between sarq and shrq

名称:值

%rdi: 0x6

%rax: 0x4

sarq 和 shrq 有什么区别?

如果我有 sarq $1, %rdi 这个值会怎样? shrq %rdi 是做什么的?

sarq是四字的算术右移,shrq是四字的逻辑右移。不同之处在于,算术移位将用最左边的位(也就是符号位)填充空位,而逻辑右移只会用 0 填充它们。

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

例如,假设 %rax = 16 (0x0000 0000 0000 0010)sar , %raxshrq , %rax 都会将 %rax 设置为 1 (0x0000 0000 0000 0001)。

现在如果%rax = -16 (0xffff ffff ffff fff0)sar , %rax 会将 %rax 设置为 -1 (0xffff ffff ffff ffff),而 shr , %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 << ruval << std::endl;


  return 0;
}