首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sarq和shrq的区别

sarq和shrq的区别
EN

Stack Overflow用户
提问于 2019-11-06 02:56:29
回答 2查看 4.1K关注 0票数 3

名称:价值

百分比rdi: 0x6

%rax: 0x4

沙克和沙克有什么区别?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-06 03:32:44

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用于无符号数据类型。

票数 4
EN

Stack Overflow用户

发布于 2019-11-06 03:36:53

区别在于sarq工作在有符号整数上,shrq工作在无符号整数上。基本上,如果设置了整数中的最高位,sarq将在1中移动(否则为零)。shrq只会在0中移动。你可以很容易地看到他们用一些简单的C做什么。

代码语言:javascript
运行
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58722453

复制
相关文章

相似问题

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