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 , %rax
和 shrq , %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;
}
名称:值
%rdi: 0x6
%rax: 0x4
sarq 和 shrq 有什么区别?
如果我有 sarq $1, %rdi 这个值会怎样? shrq %rdi 是做什么的?
sarq
是四字的算术右移,shrq
是四字的逻辑右移。不同之处在于,算术移位将用最左边的位(也就是符号位)填充空位,而逻辑右移只会用 0 填充它们。
对于正数,它们的行为是相同的。对于负数,它们的行为完全不同。
例如,假设 %rax = 16 (0x0000 0000 0000 0010)
。 sar , %rax
和 shrq , %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;
}