计算机中补码理解(方便理解各种语言中的位操作)

转自:https://blog.csdn.net/woailuo453786790/article/details/51427847    方便阅读,经过简单整理

概述

在计算机的8位二进制表示法中,有原码、反码、补码三种方法。最高位均表示符号位,0+1-
原码   
正数 0 XXXXXXX
负数 1 XXXXXXX
反码
正数 0 XXXXXXX(同原码)
负数 1 XXXXXXX(原码取反)
补码
正数 0 XXXXXXX(同原码)
负数 1 XXXXXXX(原码取反+1)

由于原码和反码中,+0与-0的表示并不相同,所以计算机中一般使用补码;

其实还有一个更重要的作用,就是利用高位溢出,将减法运算变成加法运算。(简化运算的设计)

正因如此:补码负数表示范围可以多表示一个最负的数。(-2^n 整数 或者  -1 纯小数)n为2进制位数)

举例

9-4=5

9+6=15 15-10=5

即:A-B=D
    A+C-(B+C)=D ------------------------------------------(1)
化为二进制:
9(A):0000 1001 补码:0000 1001
-4(-B):1000 0100 反码:1111 1011 补码(C):1111 1100
4(B):0000 0100
运算:0000 1001
        + 1111 1100
           --------------

         10000 0101

高位溢出舍去,即得0000 0101 即5,实现减法变加法。也就是说,在计算机中,把两数相减看成是一个正数加上一个负数,把这两个数的补码相加,高位溢出,就实现了减法变加法。


原理:


关键在于,在式(1)中,负数(-B)的绝对值(即相应的正数B)的原码加该负数(-B)的反码得1111 1111即2的8次方-1,那么负数的绝对值(即相应的正数)的原码加该负数的补码(C),即(B+C)就是2的8次方,即1 0000 0000,可以通过溢出“减”去。那么,我们就只要计算A+C,即补码相加。
(2)计算机中使用补码的原理
在计算机系统中,数值一律用补码来表示(存储)。 
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 

码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

不理解的继续看,理解的可以结束:

补码与原码的转换过程几乎是相同的。 
数值的补码表示也分两种情况: 
(1)正数的补码:与原码相同。 
例如,+9的补码是00001001。 
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码 
0000111按位取反为1111000;再加1,所以-7的补码是11111001。 
已知一个数的补码,求原码的操作分两种情况: 
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。 
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取 
反,然后再整个数加1。 
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负 
数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。 
在“闲扯原码、反码、补码”文件中,没有提到一个很重要的概念“模”。我在这里稍微介绍一下“模” 
的概念: 
“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范 
围,即都存在一个“模”。例如: 
时钟的计量范围是0~11,模=12。 
表示n位的计算机计量范围是0~2(n)-1,模=2(n)。【注:n表示指数】 
“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的 
余数。任何有模的计量器,均可化减法为加法运算。 
例如: 假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法: 
一种是倒拨4小时,即:10-4=6 
另一种是顺拨8小时:10+8=12+6=6 
在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。 
对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特 
性。共同的特点是两者相加等于模。 
对于计算机,其概念和方法完全一样。n位计算机,设n=8, 所能表示的最大数是11111111,若再 
加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的 
模为2(8)。 在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以 
了。把补数用到计算机对数的处理上,就是补码。 
(3)
这样,我们计算5-3就可以换成5+13。3的二进制表示为0011,5的二进制表示为0101。这样,0101-0011就可以表示为0101+(-0011)。我们在计算机中都是把负数用其补码表示,-0011的补码就是10000-0011(即16-3,也就是13)。10000-0011=1+1111-0011=1+(1111-0011)=1+1100=1101。我们总说补码是“按位取反再加一”,看了上面这个式子相信大家就会明白了,其实就是把10000-0011换成了1111-0011再加1的形式。然后,0101-0011就换成了0101+1101,它们计算出来的结果为10010。由于我们的计算机只有四个bit,所以结果为0010。即,在模16的计算机中,5-3=5+13=2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值