有符号数的二进制表示法、加减法、补码


基本概念

有符号数
有符号数的概念当然就是,用一个比特表示正负了,很明显是这样,比如:+8为00001000,-8就是10001000(这里呢就用8位的长度表示数值),可见在+8和-8的二进制有符号表示的时候差别就在首位字节,就是第一个比特了。这就是有符号数。
有符号数带来的问题
8位的数据的二进制范围是,00000000-11111111,即十进制的0-255,。有符号数的首位可是有含义的,所以二进制仍然是00000000-11111111,但是十进制的范围就成了,-128-+127,就是-128到+127,然而这是有问题的,什么问题?有没有想过0该这么表示,10000000(-0)还是00000000(+0)。这的确是个问题,如果有了正负0那么取值的范围很明显就是-127到+127了嘛,中间有两个正负0。当然严谨的计算机科学家是不允许的,所以只能有一个表示十进制的0,那就是00000000,可是10000000表示个啥?规定表示为-128,这样就解决了两个0的问题,而且取值的范围就是-128到+127。
有符号数之间的跳变?
什么事跳变,其实就是溢出,什么又是溢出,其实就是数值的超出了范围。举个例子,8位有符号数范围我们是知道了就是-128到+127,但是当我超出了+127时会怎样?看一下
十进制来看是这样的,但是+128已经超出了表示的范围了。那么跳变就出现了。通过二进制看一下

01111111(+127)

+00000001( +1)


=10000000(-128)

二进制相加的结果是10000000,从前面的定义我们知道它是-128。这就是溢出了,发生了跳变。

有符号数的加法

前面也用到了有符号数的加法,在正数时,不超过+127范围时还是正常的,该是几就是几。超出就是负数了,那么我们讨论一下负数的加法。
10000000(-128)

+00000001 (+1)


=10000001(-1)
以下是重点
结果怎么是这样呢?怎么会是-1而不是-127呢?跟我想的不一样,很不开心。可是不开心是没有用的,我们仍然要解决问题。怎么解决?
2、改变表示方式。什么意思?就是说-128在计算机中并不是用10000000存储,而是其他的,怎么表示呢?把负数表示成什么0减去一个正数?试试看

-128为0-128,100000000(9位,理解为向第9位借了一位1)-10000000=11111111+00000001-10000000=100000000

-127为0-127,100000000(9位,理解为向第9位借了一位1)-01111111,即11111111+00000001-01111111=10000001

这样看起来真是是对的了!这样为什么是可以的?

1、两边是恒等式,因为两边都有向第9位借了1位,其实就是两边都加了一个数。即,

-128+1=-127可以表示为(256-128)+1=(256-127),二进制表示为

[(11111111+00000001)-10000000]+00000001=[(11111111+00000001)-01111111]=10000001。

计算机中的有符号数有三种表示方法,即 原码、反码、补码

三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理,用加法来替代减法。

整型数据在内存中的存放,是以补码表示的:

1)正数的补码,反码,都与其原码相同

2)负数的补码,将该数的绝对值得二进制形式按位取反再加1

-5 = 1000 0101[原] = 1111 1010[反] + 1 = 1111 1011[补] (计算机内存的都是补码)

根据上面的理论,-5的补码就是256-5=251[1111 1011],但问题是我们正在解决减法问题,现在计算机还不会做减法,计算机怎么得到[1111 1011],

于是先辈们发明了一种算法,先得出原码[1000 0101],然后符号位不变,其余位取反(逻辑非),得到反码[1111 1010],再加1,得到了[1111 1011]。就是说,原反补码可以跳过计算直接得出2进制码。

通过补码求原码

当补码最高位为0时

因为最高位为0,即该数是正数,正数的原码、反码、补码都是一样的。
所以该补码即是原码。

例如:【X】补=01111111求真值。

解:因为最高位为0,所以【X】原=【X】补=01111111=127.

当补码最高位为1时

因为最高位是1,所以该数为负数。负数的补码=反码+1

补码 的补码 即为该补码的原码(真值)。
例如:【X】补=D9H,求X的真值。

解:【X】补=1101 1001,{【X】补}补=1010 0111=-39

通过补码直接求十进制数

二进制补码,转十进制,可以直接进行。
不必经过原码反码。

你只要记住:【补码首位的权,是负数】。

普通的 8 位二进制数,其各个位的权,如下所示:
   128、64、32、16、8、4、2、1。
而 8 位二进制补码,其首位的权是负数,如下所示:
  -128、64、32、16、8、4、2、1。

如果 8 位补码是 1000 0001,其十进制就是:
  -128 + 0 + 0 + 0 + 0 + 0 + 0 + 1 = -127。
你用 “取反加一” 来做吧,没有这么简便了。

如果 8 位补码是 1100 1001,其十进制就是:
  -128 + 64 + 8 + 1 = -55。

如果 8 位补码是 0100 1001,其十进制就是:
   0 + 64 + 8 + 1 = +73。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值