原码、反码、补码

匿名 (未验证) 提交于 2019-12-02 23:38:02

注意,我们这里举列的原码和反码只是为了求负数的补码,在计算机中没有原码,反码的存在,只有补码。

一.原码

  1. 正数的原码就是它的本身

    假设使用一个字节存储整数,整数10的原码是:0000 1010

  2. 负数用最高位是1表示负数

    假设使用一个字节存储整数,整数-10的原码是:1000 1010

二.反码

  1. 正数的反码跟原码一样

    假设使用一个字节存储整数,整数10的反码是:0000 1010

  2. 负数的反码是负数的原码按位取反(0变1,1变0),符号位不变

    假设使用一个字节存储整数,整数-10的反码是:1111 0101

三.补码(再次强调,整数的补码才是在计算机中的存储形式。)

  1. 正数的补码和原码一样
    假设使用一个字节存储整数,整数10的补码是:0000 1010(第三次强调:这一串是10这个整数在计算机中存储形式)

  2. 负数的补码是负数的反码加1
    假设使用一个字节存储整数,整数-10的补码是:1111 0110(第三次强调:这一串是-10这个整数在计算机中存储形式)

四.在计算机中,为什么不用原码和反码,而是用补码呢?

因为在使用原码,反码在计算时不准确,使用补码计算时才准确。

  1. 使用原码计算10-10
    0000 1010  (10的原码)
    +1000 1010   (-10的原码)

    1001 0100  (结果为:-20,很显然按照原码计算答案是否定的。)


  1. 使用反码计算10-10
    0000 1010  (10的反码)
    +1111 0101  (-10的反码)

    1111 1111  (计算的结果为反码,我们转换为原码的结果为:1000 0000,最终的结果为:-0,很显然按照反码计算答案也是否定的。)


  1. 使用补码计算10-10
    0000 1010  (10的补码)
    +1111 0110  (-10的补码)

    1 0000 0000  (由于我们这里使用了的1个字节存储,因此只能存储8位,最高位(第九位)那个1没有地方存,就被丢弃了。因此,结果为:0)


五.小试牛刀

有了上面的案例,接下来,我们来做几个小练习吧,分别计算以下反码表示的十进制数字是多少呢?

  1. 0b0000 1111

    相信这个数字大家异口同声的就能说出它的答案是:15(因为正数的补码和原码一样)

  2. 0b1111 1111

    计算过程:0b1111 1111(补码)------>0b1111 1110(反码)------>0b1000 0001(原码)
    将其换算成原码之后就可以得到最后的结果为:-1

  3. 0b1111 0000

    计算过程:0b1111 0000(补码)------>0b1110 1111(反码)------>0b10010000(原码)
    将其换算成原码之后就可以得到最后的结果为:-16

  4. 0b1000 0001

    计算过程:0b1000 0001(补码)------>0b1000 0000(反码)------->0b1111 1111(原码)
    将其换算成原码之后就可以得到最后的结果为:-127

文章来源: https://blog.csdn.net/weixin_37490221/article/details/90753893
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!