补数为何存在?
为了将减法以加法的形式进行实作,减少电路开销(省去减法器)。
补数的讨论
一般来说,讨论补数会考虑到两种形式,在基底(Base)为r的条件下,讨论以下
- r的补数 (r's complements),又称为radix complements
- (r - 1)的补数(r - 1's complements),又称为diminished radix complements
举例来说,以基底为10的数,我们会讨论其10的补数和9的补数
补数的定义
定义:有一数字N,基底为r,共有n位数,则
的补数:
的补数:
观察:的补数 =
的补数
范例1 : 有一数字135( N ),基底为10( r ),共有3( n )位数
的补数 :
的补数 :
的补数
的补数
范例2 : 有一数字,基底为
,共有
位数
的补数 :
> 10000000
> - 1101100
> ---------
> 0010100
的补数:
> 1111111
> - 1101100
> ---------
> 0010011
的补数
的补数
补数应用,使用补数实作出减法
范例1. 计算
由於M为五位数,N为四位数,两位数相同才可进行运算,将N改为五位数,变成03250
- 将3250转换为补数的形式(使用10的补数)
原式 使用10的补数转换後
> 72532 > 72532
> - 03250 --> > + 96750
> ------ > -------
> 69282 > 169282 (1为进位,将其舍去)
减掉某一个数事实上就是加上他的补数
范例2. 计算
由於M为四位数,N为五位数,两位数相同才可进行运算,将M改为五位数,变成03250
- 将72532转换为补数形式(使用10的补数)
原式 使用10的补数转换後 将计算得到的结果再做10的补数并加上负号
> 03250 > 03250 > 100000
> - 72532 --> > + 27468 --> > - 30718 --> 取负号 --> -69282
> ------ > ------- > -------
> -69282 > 30718 > 69282
范例3. 计算
1.将1000011转换为补数形式(使用2的补数)
原式 使用2的补数转换後
> 1010100 > 1010100
> - 1000011 --> > + 0111101
> -------- > ---------
> 0010001 > 10010001 (1为进位,将其舍去)
范例4. 计算
将1010100转换为补数形式(使用2的补数)
原式 使用2的补数转换後 将计算得到的结果再做2的补数并加上负号
> 1000011 > 1000011 > 10000000
> - 1010100 --> > + 0101100 --> > - 1101111 --> 取负号 --> -0010001
> -------- > --------- > ---------
> -0010001 > 1101111 > 0010001
二进位有号数
为了表示一个有号数,我们将一个数字的最左边位元做为表示符号的用途,一般来说,0表示正数,1表示负数。
范例1. 使用8 bit 二进位有号数来表示-9
9的二进位无号数形式0001001
这里我们必须将最左边的bit用来表示正负号,因此我们只使用7个bit来表示这个数的数值大小,而表示数值大小我们有三种方式
1. 二进位 2. 1的补数 3. 2的补数
0001001 1110110 1110111
1. 有号二进位 2. 有号1的补数 3. 有号2的补数
[1]0001001 [1]1110110 [1]1110111
通常情况我们使用2的补数来做为表示,原因为使用二进位表示法和1的补数表示法,会存在0有两种不同的表示法,且两者皆无法表示-8,而2的补数不存在这一些问题,因此我们使用2的补数做为表示有号数的方式。
表示范围
对一个有n bit的二进位系统而言
无号数范围 ~
有号数范围 ~
以4 bit的二进位系统而言
无号数范围 ~
有号数范围 ~
比较2的补数和有号2的补数
我们使用有号8 bits的二进位表示法来表示-9
有号2的补数
9 = 0001001 (只使用7个bit)
-9 = 11110111 (加上符号表示的bit)
2的补数
9 = 00001001 (使用8个bit)
-9 = 11110111
小结:n bits的二补数表示法 = (n - 1)bits有号二的补数表示法
加法与减法
- 负数以2的补数法来表示
- 使用加法进行运算
- 产生进位时,省略
- 产生结果为负时,会自动转换为2的补数
范例1.
十进位 7 bits二进位 有号2的补数
6 0000110 0_0000110
13 0001101 0_0001101
-13 1_1110011(取13对2的补数後加上符号)
------------------------------------------------------
> 6 有号2的补数 > 00000110
> +(-13) --------> > + 11110011
> ------ > ----------
> -7 > 11111001
> ^
> 负数符号 後方7bit为7的2的补数
溢位(Overflow)
假设一个8 bit系统的有号二补数的加法
> 65 > 01000001
> + 70 > + 01000110
> ---- > ----------
> 135 > 10000111
加完之後我们会发现值变成负的,这是因为8 bit二埔数系统表示的值范围在-128 ~ 127,而65 + 70 = 135,这个值超出了表示范围,因此出现错误的结果,这样的现象称为溢位。
BCD(Binary Coded Decimal)
使用一组4 bit来表示十进位0 ~ 9。
范例 1:
好处:快速将十进位转换到二进位,有些无法以二进位有限位数表示的小数,如0.2,使用BCD可以非常简便的表示出来
坏处:浪费记忆体中间,本来4 bit可以表示成16种组合,现在只能表示成10种组合