zoukankan      html  css  js  c++  java
  • 关于原码,反码,补码的简单认识

      首先我们都明白,计算机是只能运行数字的。其次,为了方便,计算机只能运行二进制的数字,也就是说,计算机只能识别带有0、1的数字。而人们日常用的是十进制的数字,所以,为了和计算机进行沟通,必须将我们下达给计算机的命令全部转化为二进制的数字,这样计算机才会正常执行命令。由此,原码,反码,补码的概念出现了。

    (1)原码

      原码规则:符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

      说到数字,不得不提的一点就是数字有正(+)负(-)之分,而计算机却不能识别正负号,所以人们规定,计算机字长为8位,第一位是符号位, 0就代表正数,1代表负数。其余7位用来储存数据。

      比如2,原码为00000010;-2,原码为10000010。而此时,问题就又出来了,2 - 2 = ?这是非常“白痴”的一个问题,答案当然是0了。但如果让计算机去做呢?

      计算机会这么想:因为2 - 2 = 2 + (-2),又因为2 = 00000010且-2 = 10000010,所以,2 + (-2) = 00000010 + 10000010 = 10000100 = -3。于是,计算机就将 -3输出在显示屏上了。

      答案对吗?废话,当然是错的了。而仔细分析计算机的计算过程,你就会发现,计算机错就错在符号问题上,因为用了首位去代替符号,所以用原码计算的数值就是错误的。怎样解决这个问题呢?反码诞生了。

    (2)反码

      反码规则:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。

      还是刚才那道题:2 - 2 = ?

      为了解决这道题,我们将反码的规则交给计算机,于是,计算机就会这样思考这道题了:因为2 - 2 = 2 + (-2),又因为2(原) = 00000010

    且-2(原) = 10000010,又因为,2(反) = 00000010且 -2(反)= 11111101,所以 2 + (-2)= 2(反)+(-2)(反)= 00000010 + 11111101 = 11111111

    所以转换成原码得到-0。于是,显示屏这次显示的答案:-0。

      0是正确答案,那-0是怎么回事?众所周知,符号对于0是没有意义的,也就是说,不管 +0还是 -0都是0。但问题是死板的计算机不知道啊,它只会输出它计算后得到的数字。所以这道简单的小学计算题计算机又算错了。怎样让计算机算对这道小学计算题呢?我们将补码的执行规则交给了计算机。

    (3)补码

      补码规则:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反码的基础上+1)

      继续执行 2 - 2 = ?的问题。

      这次计算机该怎样思考呢?它会这么想:因为2 - 2 = 2 + (-2),又因为2(原) = 00000010且-2(原) = 10000010,又因为,2(反) = 00000010且 -2(反)= 11111101,又因为,2(补)= 00000010且 -2(补)= 11111110,所以 2 + (-2)= 2(补)+(-2)(补)= 00000010 + 11111110 = 100000000

    咦,得到一个九位数,数据溢出了,那就得到00000000。所以,显示屏这次显示了正确答案:0。我们的计算机总算是做对了一道小学计算题。

      总结

      原码的优点是转换方便,与我们所用的十进制数字联系较为紧密,便于使用。而反码就像是原码的补丁,用来解决原码不能计算加减运算的弊端。补码就是反码的补丁,用来解决反码中+0和-0的不统一问题。而由于补码的全能型,计算机储存数据时全部都是用补码储存的。所以,原码,反码和补码是计算机中必不可少的数据功能。

  • 相关阅读:
    [ZJOI2013]K大数查询 浅谈整体二分
    2019暑假杭二day1测试总结
    2019暑假杭二day2测试总结
    2019暑假杭二day3测试总结
    2019暑假杭二day4测试总结
    2019暑假杭二day5测试总结
    一些有趣的教学视频
    karatsuba乘法
    多项式求逆元
    FFT
  • 原文地址:https://www.cnblogs.com/YXSZ/p/9741785.html
Copyright © 2011-2022 走看看