移位运算的问题「建议收藏」

移位运算的问题「建议收藏」正数正数的原码,反码,补码相同正数,左移乘2,右移除2左移右移都补0如果左移丢1,会出错;如果右移丢1,会影响精度负数负数的原码左移补0,右移也补0左移丢1,会出错;右移丢1,会出错负数的反码左移补1,右移补1(因为原码补0不影响,那么反码应该补1)左移丢0,会出错(这里的0是原码中的1),右移丢0,会出错负数的补码从右往左的第一个1(包括这个1)往右的数和原码一样,

大家好,又见面了,我是你们的朋友全栈君。

正数

正数的原码,反码,补码相同
正数,左移乘2,右移除2
左移右移都补0
如果左移丢1,会出错;如果右移丢1,会影响精度

负数

负数的原码左移补0,右移也补0
    左移丢1,会出错;右移丢1,会出错
负数的反码左移补1,右移补1(因为原码补0不影响,那么反码应该补1)
    左移丢0,会出错(这里的0是原码中的1),右移丢0,会出错
负数的补码从右往左的第一个1(包括这个1)往右的数和原码一样,是原码
    往左和补码一样,是补码
        所以补码可以看成由反码和原码两部分组成
            那么左移补0,右移补1
    左移丢1(丢的是原码的1),会出错;右移丢0(丢的是反码的0),会出错

举例

-26
二进制表示:-001 1010
原码:1001 1010
反码:1110 0101
补码:1110 0110
移位运算的问题「建议收藏」

可见红框中补码与原码相同,蓝绿框中补码与反码相同

由于只有7位数值位,一位符号位,那么所表示的数值的大小是有限的,所以不能一直左移,那么左移到什么程度就该停止防止溢出呢?

移位运算的问题「建议收藏」

    右移会影响精度,会出现补码和原码反码右移相同的位数,最终的结果却不一样的情况,不再画图表示
上面的图片体现了计算机判断左移右移是否正确的方法,即对于原码左移丢1会出错,对于反码左移丢0会出错,也就是说原码的1不能丢,反码的0不能丢,那么对于补码呢?
    补码由两部分组成
    补码的反码部分:0不能丢,丢了会出错
    补码的原码部分:1不能丢,丢了会出错

但是有一个特例
-32
移位运算的问题「建议收藏」
-32的补码左移两位,那么-32原码部分的那个1就会被移掉,但是并不错,因为左移后的1000 0000对于补码是-128,-32左移两次相当于乘以4等于-128,但是左移丢原码的1应该不对啊,但是结果却是对的,那么计算机如何处理这个特例呢?

    这其中的特殊之处,就是因为补码中少表示一个-0,就可以多表示一个数,这个多表示的数就是-128,对于原码和反码,如果有一位符号位的话,是表示不了-128的,但是对于补码却可以。
如果计算机是通过判断左移丢的1是原码的1,左移丢的0是反码的0来判断是否溢出的话,那么-32左移丢原码的1就是错的,但结果却是对的,计算机是认为他是对的输出呢,还是认为他是错的不输出呢?
    如果认为是对的,那么就不能按丢的1或0是不是原码或反码的规则来判断是否左移运算是否正确?
        那么不是这种判断方法,那又是什么方法呢?
            要么有一套规则处理这个特例,要么就得有一个更好的规则可以包括这个特例。
    如果认为是错的,那补码即使可以多表示出一个-128,但是在实际计算中却不能表示出来(认为移位运算得出的-128是错的,不应该存在),多表示这个-128有什么意义呢?
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159250.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Unity Excel转Json工具实现多语言本地化

    Unity Excel转Json工具实现多语言本地化文章介绍Unity3d添加工具,实现excel转json功能

    2022年5月28日
    55
  • 漏洞: RHSA-2017:3075: wget security update

    漏洞: RHSA-2017:3075: wget security update

    2021年10月18日
    45
  • Docker安装Rabbitmq超详细教程

    Docker安装Rabbitmq超详细教程安装Rabbitmq1.使用docker查询rabbitmq的镜像dockersearchrabbitmq2.安装镜像安装name为rabbitmq的这里是直接安装最新的,如果需要安装其他版本在rabbitmq后面跟上版本号即可dockerpullrabbitmq3.运行mq:dockerrun-d–hostnamemy-rabbit–namerabbit-p15672:15672-p5673:5672rabbitmq通过dockerps-a查看部

    2022年5月24日
    56
  • 根据IP地址和子网掩码求网络号、主机号

    根据IP地址和子网掩码求网络号、主机号一、理论阐述目前,IP地址主要使用32位的二进制来表示,即IPv4地址。由于32位二进制不容易记忆和书写,故采用点分十进制形式来表示IP地址。IP地址由两部分组成{<网络号>,<主机号>},网络号表示计算机所在的网络,供路由器在进行路由选择时使用;主机号是计算机在该网络中的唯一标识。IP地址分为A、B、C、D、E五类,其中:A类IP地址第一个字节的范围是:1~126…

    2022年6月24日
    32
  • MSYS以及MinGW安装

    MSYS以及MinGW安装MSYS以及MinGW安装文章目录MSYS以及MinGW安装下载并安装MSYS安装基础运行库(glibc,cmake,make等)下载并安装MSYS下载传送门点击下载Windows64bit,双击安装选择安装目录安装完成!!!安装基础运行库(glibc,cmake,make等)$pacman-Syu$pacman-Su$pacman-S–neededbase-develmingw-w64-x86_64-toolchain基础运行库安装完成,现在可以编译Co

    2022年6月16日
    37
  • 大数据处理的基本流程是什么?[通俗易懂]

    写在前面本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定大数据理论体系解答大数据处理流程主要分为3步:1.数据抽取和集成2.数据分析3.数据解释补充1.数据抽取与集成由于大数据处理的数据来源类型丰富,利用多个数据库来接收来自客户端的数据,包括企业内部数据库、互联网数据和物联网数据,所以需要从数据中提取关系和实体,经过关联和聚合等操作,按照统一定义的格式对数据

    2022年4月9日
    80

发表回复

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

关注全栈程序员社区公众号