zoukankan      html  css  js  c++  java
  • 关于左移运算符的一点疑问及个人理解(不知道对不对)

    今天有同学提问一个问题:

    int i = 1;//32bit

    i=i<<32;

    之后i=?;

    按照之前的理解:32位的整型数据1的二进制为:0000 0000 0000 0000 0000 0000 0000 0001,

                                        往左移一位将变成:0000 0000 0000 0000 0000 0000 0000 0010;

                                        往左移两位将变成:0000 0000 0000 0000 0000 0000 0000 0100;

                                                       ........

                                 那么向左移31位会变成: 1000 0000 0000 0000 0000 0000 0000 0000;

    以上结果都在VS2005的环境下验证是正确的。那么按照以上规律,向左移32位应该会是这样:

                                                                  0000 0000 0000 0000 0000 0000 0000 0000

    我猜想得到的结果是0,但是实际结果是1。这一点让我很不解,于是在网上提问,有人帮我解决了疑问:

    左移运算时,当要移的位数n大于或者等于被移数据类型位数m的时候,将n对m求余再移位,即向左移n%m位。

    也就是说i<<32,其实就是i<<(32%32),也就是i<<0,那么i还是1咯~

    好的,那么接下来还有一个问题:i<<-1呢?应该是多少?纳尼?还有移负数位的啊???

    是的,还有移负数位的,那么结果是多少呢?猜都不知道怎么猜的答案,实验结果是:0x8000 0000;

    那么为什么会是这样呢?

    于是我这样想:(以下全代表个人观点,不知道对不对)

    负数在内存中是以补码的形式存储的,-1的补码就是:0xffffffff,

    于是我将代码中的i<<-1改为i<0xffffffff,得到的结果仍然是0x8000 0000,

    于是我猜想左移的时候,将移的位数m是当做无符号数来处理的。那么当i<<0xffff ffff是时候其实就是,i<<(0xffff ffff%32)即i<<31,那么结果刚好就是

    0x8000 0000。

    不知道我这样理解对不对。还请各位指教。

  • 相关阅读:
    巧用 Patch Connect Plus 简化 Intune 第三方更新管理
    如何应对薄弱的企业安全意识
    Jira可视化数据分析解决方案
    终端安全:保护企业的关键
    为什么需要ITIL服务目录
    防抖、节流函数封装(站在巨人的肩膀上)
    vue服务器渲染--NUXT
    函数防抖,函数节流(站在巨人的肩膀上)
    MAC地址和IP地址的区别和联系(站在巨人的肩膀上)
    ES8新特性(2017)-- async/await详细介绍与使用
  • 原文地址:https://www.cnblogs.com/wan0807/p/5230153.html
Copyright © 2011-2022 走看看