C语言基础--二进制的原码、反码、补码

二进制的加减运算(原码,反码,补码的理解)

  • 最近又看了,二进制加减法运算。对于很多新人可能对于二进制的加减法运算有不理解的地方,下面我将自己 的一些理解写下来,一方面做一些记录,另一方面希望能对大家有帮助。

计算机中数据的存储

  • 我们都知道计算机智能识别机器语言即0和1,那么我平时的十进制数在计算机中是如何存储的呢?计算机需要将其转换成二进制进行存储,即以0 和1的形式来表示。

    • 下面以单字节数的二进制来说明:
      5的二进制表示: 0000 0101
      -5的二进制表示:1000 0101
      其最高位代表正负,1表示负,0表示正。
  • **但是计算机在存储时并不是直接按照其二进制表示(原码)来存储的,而是按照其补码形式来进行存储的,这很重要!**因为计算机在运算时默认将原来的数表示成补码再参与运算,然后得到结果。注意此时的结果也是输出结果的补码形式。简而言之,当计算机在输出时(在屏幕上打印时)会将其转换成原码,再转换成对应的十进制数进行输出。

1.原码

  • 原码就是原数的二进制表示
    如上面的
    5 : 0000 0101
    -5: 1000 0101

2.反码

  • 正数的反码是其本身,负数的的反码等于其对应的正数的原码按位取反;当然也有一种说法负数的反码是其符号位不变其余位按位取反,其实仔细分析下你会发现这两种的说法是一样的。举例说明:
    5的反码: 0000 0101
    -5的反码:1111 1010
    这种写法是按照其对应的整数的原码按位取反得到的。
    第二种说法符号位不变,其余位按位取反。
    -5的原码:1000 0101
    -5的反码: 1111 1010
    我们会发现其符号位没变,数据位每一位都按位取反了。
    其实仔细分析 ,这就是符号位提前取反了。其余位再按位取反而已,和第一种说法本质上是一致的。

3.补码

  • 之所以会有补码一说其实是因为,对计算机来说计算减法并没有我们实际中的那么简单,所以才有补码一说用来简化计算机中的减法。
    正数的补码就是其本身,如,5 :0000 0101
    负数的补码 = 其反码 + 1
    如 ,-5的补码 = 1111 1010 +1 =1111 1011
    那么 5 -5其实就等于5 +(-5),用其补码来计算:
    0000 0101
    +1111 1011
    1 0000 0000

    可以看出这里发生了数据溢出,因为是一个字节,最高位舍掉,取其低八位,即 0000 0000表示+0,原码也是其本身,所以输出时会会输出0。有一点需要注意的,最终得出的是其补码的形式,在输出时会转换成原码的二进制形式再转换成对应的十进制数,理解了这一点我们就不会再被二进制的计算搞的眼花缭乱了。

  • 以上的例子可能并不明显,所以再举一个例子,仍以单字节计算为例。
    7 - 9 在计算机中的运算过程和输出过程:
    7 - 9 = 7 +(-9)
    原码:
    7 :0000 0111
    -9 : 1000 1001

    反码:
    7 : 0000 0111
    -9: 1111 0110

    补码:]
    7 : 0000 0111
    -9 :1111 0111
    7 + (-9)= 0000 0111 (补码)+ 1111 0111(补码)= 1111 1110(补码)
    其原码 = 补码减1然后再按位取反,所以1111 1110的原码= ~(1111 1110 -1)= 1000 0010(原码),可以发现其是等于-2的。

  • 总结:计算机中数据是以二进制补码形式存储的,所以计算机在计算时是以其二进制补码形式来计算的。在输出时再将补码的结果转化成原码,再将原码二进制转换成十进制或者其他我们需要的进制数。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值