今天看到这样一行代码
int n =0xfffffffe; int z = n >> 1 ; int m =(unsigned int )n >> 1; printf("%x %x\n",z,m);
问输出的值是多少?答案是z=0xffffffff m=0x7fffffff
这就会涉及到两个概念.
- 逻辑移位,按位进行左右移动,不关心数值的符号问题,空出来的都用0补充
- 算数移位,按位进行左右移动,两头也用0补充,但是不能使得符号位发生改变.
比如一个八位数1001 0110,最高位为符号位.
算数右移因为不能使得符号位发生改变.所以,算术右移后是1100 1011,而逻辑右移后是0.
而左移都是最低位补零.
- 算术移位指令
SAR(Shift Arithmetic Right,算数右移)
向右移动,最高位不变
SAL(Shift Arithmetic Left ,算数左移)
向左移动,最低位用0补充
- 逻辑移位指令
SHL(Shift Logical Left,逻辑左移)
SHR(Shift Logical Right逻辑右移)
左右移动空位都是用0补充.
int n = 0xfffffffe; 0014149E mov dword ptr [n],0FFFFFFFEh int z = n >> 1; 001414A5 mov eax,dword ptr [n] 001414A8 sar eax,1 001414AA mov dword ptr [z],eax int m = (unsigned int)n >> 1; 001414AD mov eax,dword ptr [n] 001414B0 shr eax,1 001414B2 mov dword ptr [m],eax 第一个计算z的值,因为是有符号的,所以是sar算数右移.
计算m的值的时候,无符号,所以是shr逻辑右移
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198592.html原文链接:https://javaforall.net
