C语言 移位运算_c语言位移是怎么位移的[通俗易懂]

C语言 移位运算_c语言位移是怎么位移的[通俗易懂]今天看到这样一行代码intn=0xfffffffe;intz=n>>1;intm=(unsignedint)n>>1;printf(“%x%x\n”,z,m);问输出的值是多少?答案是z=0xf

C语言

今天看到这样一行代码

    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,而逻辑右移后是01001011.
而左移都是最低位补零.

再看最上面的问题,因为n是int类型(有正负),所以
n >> 1是算数右移,需要考虑符号位的问题,符号位保持不变.而
(unsigned int)n >> 1先将n强制转换为无符号类型再右移,所以是逻辑右移,最高位用0补充.

接下来再从汇编层面分析一下.
先介绍四个汇编指令

  • 算术移位指令
    SAR(Shift Arithmetic Right,算数右移)
    向右移动,最高位不变
    SAL(Shift Arithmetic Left ,算数左移)
    向左移动,最低位用0补充

  • 逻辑移位指令
    SHL(Shift Logical Left,逻辑左移)
    SHR(Shift Logical Right逻辑右移)
    左右移动空位都是用0补充.

现在我们将上面的代码用vs2013进行断点调试.
然后快捷键CTRL+ALT+D查看反汇编代码

	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逻辑右移

今天的文章C语言 移位运算_c语言位移是怎么位移的[通俗易懂]分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/69541.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注