• 计算机中原码,反码,补码之间的关系


      最近在刷C和指针的题目,刷到一题需要补码的知识,在自己脑子里面一搜罗,发现概念已经有些模糊了。刚好播客的申请通过了,就来试试水吧!

      我们平时一起共事小伙伴总喜欢开一个玩笑,我给你一把沙子你给我造一台电脑出来! 想想也确实,计算机的核心元件也就是沙子变来的,难道这就是道家的三生万物的思想?

    呵呵,扯远了啊。

      言归正传,沙子可以说组成了计算机的体魄,那计算机的思想,灵魂本质是由什么组成的呢? 今天的主角来了:二进制!这篇文章我们不说那些太虚太高大上的东西(实际上我也说不出什么233)。就简单说说 数字 在计算机内部是怎么用二进制表示的吧。

      首先提几个概念: 原码,反码,补码 

        原码是什么?

          原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码

          举例说明:

          int类型的 3 的原码是 11B(B表示二进制位), 在32位机器上占四个字节,那么高位补零就得:

          00000000 00000000 00000000 00000011

          int类型的 -3 的绝对值的二进制位就是上面的 11B 展开后高位补零就得:

          10000000 00000000 00000000 00000011      

          但是原码有几个缺点,零分两种 +0 和 -0 。很奇怪是吧!还有,在进行不同符号的加法运算或者同符号的减法运算的时候,不能直接判断出结果的正负。你需要将两个值的绝对值进行比较,然后进行加减操作 ,最后符号位由绝对值大的决定。于是反码就产生了。

        

        反码是什么 ?

          正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反

          举例说明:

          int类型的 3 的反码是

          00000000 00000000 00000000 00000011

          和原码一样没什么可说的

          int类型的 -3 的反码是

          11111111 11111111 11111111 11111100

          除开符号位 所有位 取反

          解决了加减运算的问题,但还是有正负零之分,然后就到补码了

        

        补码是什么?

          正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1.

          还是举例说明:

          int类型的 3 的补码是:

          00000000 00000000 00000000 00000011

          int类型的 -3 的补码是

          11111111 11111111 1111111 11111101

          就是其反码加1

    最后总结一下:

        正数的反码和补码都与原码相同。

        负数的反码为对该数的原码除符号位外各位取反。

        负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1  

        

    各自的优缺点:

        原码最好理解了,但是加减法不够方便,还有两个零。。

        反码稍微困难一些,解决了加减法的问题,但还是有有个零

        补码理解困难,其他就没什么缺点了

          

     

      

  • 相关阅读:
    post和get区别
    https
    tcp/ip协议
    webpack与gulp的不同
    什么是webpack
    spring boot 输入参数统一校验
    spring boot++jpa+ mysql +maven
    Intellij IDEA 2018.2.2 SpringBoot热启动 (Maven)
    git 从远程仓克隆到本地新分支
    ASP.NET MVC 自动模型验证
  • 原文地址:https://www.cnblogs.com/hanhuo/p/6341111.html
Copyright © 2020-2023  润新知