• Java学习之计算机基础(二)


    今天主要介绍原码、反码与补码的知识。了解原码、反码与补码的知识,可以帮助我们更好地理解在计算机内部是如何进行运算的,同时对于后面更好地学习和理解Java基本数据类型及其范围打下基础。

    背景知识:

    在计算机中,最小的单位是位,也称为比特(bit)。而另一个常用单位是字节,一个字节是8位,也就是8比特。因为这个属性,本文介绍的原码、反码与补码的运算,也基于长度为8位来进行介绍

    一、原码

    原码,简单理解就是一种比较大家能比较熟悉的一种二进制表示形式。但是不同的是,为了区别正数和负数,将二进制中的最高位作为符号位,如果是0表示正数,如果是1表示负数。比如:

    0000 1000    //表示为+8
    
    1000 1000    //表示为-8
    

    二、反码

    上面我们介绍了什么是原码,原码的存在解决了一个基本的问题,那就是正数与负数区别表示的问题。这样看似完美,实则存在两个漏洞:

    【☒漏洞一】:对于正数与负数的计算会出现错误

    比如,计算 1 + (-1),正常结果应该为0,但是用原码计算会出现什么结果呢?如下图所示:

    1      0000 0001
    
    +
    
    -1     1000 0001
    
    ------------------------
    
    -2     1000 0010

    可见,因为原码中,正数与负数进行运算会产生错误。正是因为这个漏洞,诞生了反码。原码转反码的规则为:正数的反码为其本身,负数的反码是符号位不变,其他位取反。取反的规则就是如果是0就变成1,如果是1就变成0。这样,我们再来看下 1 + (-1)的计算:

           原码                反码
    
    1      0000 0001        0 000 0001
    
    +
    
    -1     1000 0001        1 111 1110
    
    ---------------------------------------------
    
           1000 0010        1 111 1111  

    看到上面的结果,你也许还是会觉得奇怪,得到的结果是11111111,这看着也不是0啊,别急,这里的11111111是反码,反码是不能直接转成十进制得到结果的,应该转成原码再进行计算。

    1 111 1111(反)  -----> 1 000 0000(原)-----> -0(十进制)

    结果为负0,负0也就是0,结果正确。漏洞一完美解决~

    三、补码

    从上面的结果,我们看到,我们利用反码完美的解决了原码带来的漏洞一。接着我们来看漏洞二。

    【☒漏洞二】:0重复的问题

    原码与反码都存在一个问题,那就是0有两种表示形式,分别为0000 0000和1000 0000,也就是正0与负0。这使得原本八位数能表示2的8次方即256个数字,使用原码与反码却只能表示255个。对于程序员来说,这已经是极大的浪费了。所以必须要解决。而解决的办法也就是使用一种新的表现形式,即补码。

    原码转补码的规则:正数的补码就是其本身,负数的补码是符号位不变,其余位数取反(即变成反码)再加1。举例如下:

    正1 --> 0000 0001(原) --> 0000 0001(反) --> 0000 0001(补)
    
    负1 --> 1000 0001(原) --> 1111  1110(反) ---> 1111 1111(补)

    从上面的例子可以看出,使用补码进行正数与负数的计算是没有问题的。大家可以计算一下。同样在补码中,规定了0的表示为0000 0000,而1000 0000表示的为-128。这里需要注意的是对于-128,可以简单的认为是一种规定,它不能转换成反码和原码。

    至此两个漏洞都已经解决。相应的,我们也介绍完了原码、反码与补码。

    【总结与注意事项】

    1. 反码与补码不能直接使用二进制转十进制的规则,转成对应的十进制得到对应的大小,应该先转成原码后才可以。也就是说原码才是直接与大小进行关联的一种表现形式

    2. 在计算机系统中,数值一律用补码的形式进行表示与存储

    3. 需要比较熟悉相互的转换规则:

      1. 正数的原码、反码与补码都是一样的

      2. 负数原转反:符号位不变,其余位取反

      3. 负数原转补:符号位不变,其余位取反后加一

      4. 负数补转反:符号位不变,其余位减一

      5. 负数补转原:符号位不变,其余位减一后取反

    原码、反码与补码的内容比较重要,原码相对比较直观,反码与补码的操作最好在纸上进行演练,这样印象更加深刻。

  • 相关阅读:
    IIS处理Asp.net请求和 Asp.net页面生命周期
    帝国CMS实现一二级导航及其高亮
    dsoframer.ocx 遇到64为系统
    实现可编辑的表格
    delegate()
    当前页面高亮的方法!
    简单的js版tab
    js判断最大值
    解决chrome下的默认样式!
    纯js点击隐藏相邻节点
  • 原文地址:https://www.cnblogs.com/yrrAwx/p/8040211.html
Copyright © 2020-2023  润新知