名称:价值
百分比rdi: 0x6
%rax: 0x4
沙克和沙克有什么区别?
如果我有sarq $1,%rdi,这个值会是什么样子?shrq %rdi做什么?
发布于 2019-11-06 03:32:44
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
用于无符号数据类型。
发布于 2019-11-06 03:36:53
区别在于sarq工作在有符号整数上,shrq工作在无符号整数上。基本上,如果设置了整数中的最高位,sarq将在1中移动(否则为零)。shrq只会在0中移动。你可以很容易地看到他们用一些简单的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;
}
https://stackoverflow.com/questions/58722453
复制相似问题