上节内容介绍了2进制编码,并介绍了源码和反码等概念,在2进制的计算中还有无符号数,有符号数,补码等概念,这些概念对于数字系统和计算机实现科学计算等都是非常重要的基础内容,可以说是计算机实现数字科学计算的基石。当然还有其它的一些非常复杂的概念如定点小数,浮点小数,向量等等,这些复杂的概念将会在相关的课程中介绍。
1.多位二进制有符号数
我们知道10进制数的正/负只要在10进制数的左边添加+,-即可,但2进制不同,由于2进制中没有任何其它字母或符号,正负号也需要用0,1表示。在2进制中分为无符号数,有符号数;而有符号数又分为正数和负数。
-
无符号数 (unsigned number)
无符号数(Unsigned number)是相对于有符号数而言的,指的是整个机器字长的全部二进制位均表示数值位,相当于数的绝对值。通俗的说,无符号数即是该数没有符号,2进制数的每一位都参与数值大小的计算。上面以及前几节内容谈到的2进制数,没有特殊说明的情况下都是指无符号的2进制数。无符号数的优点是可以最大限度的表达数值的范围。下面对应用广泛的2进制无符号数列表显示,以便记忆和使用。
表1 无符号2进制数及表达范围
2进制位数(n) | 2进制表达范围(或16进制) | 2进制最大值(或16进制) | 10进制范围 | 10进制最大值(2n-1) | 2n (n+1位) |
1 | 0- – – – – – – – – – – – – – – – – – -1 | 1 | 0- -1 | 1 | 2 |
2 | 00- – – – – – – – – – – – – – – – – -11 | 11 | 0- -3 | 3 | 4 |
3 | 000- – – – – – – – – – – – – – – – -111 | 111 | 0- -7 | 7 | 8 |
4 | 0000- – – – – – – – – – – – – – – -1111 | 1111 | 0- -15 | 15 | 16 |
5 | 0_0000- – – – – – – – – – – – – -1_1111 | 1_1111 | 0- -31 | 31 | 32 |
6 | 00_0000- – – – – – – – – – – – -11_1111 | 11_1111 | 0- -63 | 63 | 64 |
7 | 000_0000- – – – – – – – – – – -111_1111 | 111_1111 | 0- -127 | 127 | 128 |
8 | 0000_0000- – – – – – – – – – 1111_1111 | 1111_1111 | 0- -255 | 255 | 256 |
9 | 0_0000_0000- – – – – – – – -1_1111_1111 | 1_1111_1111 | 0- -511 | 511 | 512 |
10 | 00_0000_0000- – – – – – – -11_1111_1111 | 11_1111_1111 | 0- -1023 | 1023 | 1024 |
11 | 000_0000_0000- – – – – – -111_1111_1111 | 111_1111_1111 | 0- -2047 | 2047 | 2048 |
12 | 0000_0000_0000- – – – – -1111_1111_1111 | 1111_1111_1111 | 0- -4095 | 4095 | 4096 |
13 | 0_0000_0000_0000- – – -1_1111_1111_1111 | 1_1111_1111_1111 | 0- -8191 | 8191 | 8192 |
14 | 00_0000_0000_0000- – -11_1111_1111_1111 | 11_1111_1111_1111 | 0- -16383 | 16383 | 16384 |
15 | 000_0000_0000_0000- -111_1111_1111_1111 | 111_1111_1111_1111 | 0- -32767 | 32767 | 32768 |
16 | 16’h0000- -16’hFFFF | 16’hFFFF | 0- -65535 | 65535 | 65536 |
20 | 20’h0_0000- -20’hF_FFFF | 20’hF_FFFF | 0- -1M-1 0- – 1048575 | 1M-1 | 1M (1048576) |
24 | 24’h00_0000–24’hFF_FFFF | 24’hFF_FFFF | 0- -16M-1 | 16M-1 | 16M ( 16,777,216) |
28 | 28’h000_0000 – – 27’hFFF_FFFF | 28’hFFF_FFFF | 0- -256M-1 | 256M-1 | 256M |
32 | 32’h0000_0000- -32’hFFFF_FFFF | 32’hFFFF_FFFF | 0- -4096M-1 | 4096M-1 | 4096M (4G) |
-
有符号数(signed number)
由于数字系统真正的字符只有0,1两个字码,因此2进制的有符号数的正、负号也必须由0,1表示。将2进制数中的最高位(最左边的位)作为符号位使用,0表示正数,1表示负数,如:
01,011,0111,0101,0011,01_1101,0101_1101,0011_1101_1000等都是正数,而10,101,100,1000,1100,1_0101,11_0000,101_0001, 1101_0011等都是负数。所有位都为0的2进制数为0,如0,00,000,0000,00000等都是0。
-
- 正数:符号位为0的2进制数为正数,除了符号位外,其它各位按照权值展开法即可得到对应的10进制正数,注意小数部分的权值是2的负幂(2-N), 2位,3位正数(含0)如下表,
表2 2位2进制正数(含0)
2进制(2位) | 10进制数 |
00 | 0 |
01 | 1 |
表3 3位2进制数
3位2进制数 | 10进制数 |
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
其它位数的2进制列表与表2,表3 非常类似,这里就不在一一列表了。
-
2进制负数 (negative number)
2进制负数可以用0及正数的反码表示,其中0的反码是绝对值最小的负数。如: 00,01分别为0和+1,其反码为11,10分别为10进制的-1和-2。将0,正数和负数合在一起,就形成了有符号数。2位和3位的2进制有符号数如表4,表5所示。
表4 两位2进制有符号数
2进制 | 10进制 | 正负 |
01 | 1 | 正数 |
00 | 0 | 0 |
11 | -1 | 负数,正数或0的反码 |
10 | -2 |
表5 3位有符号数
3位2进制有符号数 | 10进制 | 正负(或0) | 说明 |
011 | 3 | 正数 | 源码 |
010 | 2 | 正数 | |
001 | 1 | 正数 | |
000 | 0 | 0 | |
111 | -1 | 负数 | 000的反码 |
110 | -2 | 负数 | 001的反码 |
101 | -3 | 负数 | 010的反码 |
100 | -4 | 负数 | 011的反码 |
表4,表5列举2位和3位2进制有符号数对应关系,并按照正、负增长的顺序排列。 更多位数的2进制(如4位,8位,16位,32位等)列表与表4,表5类似,只是表中的项数增多。
那么为什么可以用0或正数的反码表示负数呢?这里仅作说明,不做严格证明。
-
2进制负数求解
以3位2进制数001为例说明如下:
(1)10进制+1对应的负数为-1,二者相加为0,即1+(-1)=0,
(2)+1的2进制数001,假设-1对应的2进制数为b2b1b0,
(3)2进制数对应的值相加也应为000, 即001+b2b1b0=000。在加法运算时,如果最高位有进位位直接丢弃,因为这里限定3位2进制数。则b2b1b0求解如下:
-
-
- 001+b2b1b0=000 —> b2b1b0= 000-001=111, 而111正是000的反码
- 验算 001+111=(1)000,丢弃最高位进位 , 001+111=000,满足要求
-
(4)通过步骤(1)到(3)同样可以求出其它负数
-
N位有符号数X的表达范围
N位有符号数对应的10进制数的表达范围: -2N-1 =< X <= +2N-1-1 ,如3位2进制数的表达范围为 : -23-1 =< X <= 23-1 -1 —>-22 =< X <= 22 -1 —> -4 =< X <= +3 。
-
正负数与源码、反码的对应关系
由于0的反码为-1,+1的反码为-2,+2的反码为-3, …… 因此通过观察可以得出结论,虽然使用反码可以表示负数,但源码与反码对应的顺序相差一个。
练习题:请列表显示4位2进制有符号数的正数,0,负数,观察源码,反码的对应关系。并列举部分8位2进制数,16位2进制数的正数,0,负数,源码、反码的对应关系。
2. 2进制补码(2’s complement number)
在探讨2进制补码之前,先说明什么是补码。N进制数的基数为N,权值为Q=Nn, NM个元素{0,1,….,NM-1}组成的数集S,即S={0,1,….,NM-1},总共NM个数;在这个数集内定义加法和减法运算,
(1)加法和减法遵循正常的运算规则
(2)加法和减法运算结果也必须在S的范围内,超过NM-1的值,通过进位位调整
例: 10进制数,N=10,M=2, S={0,1,2,…99}, S内的两个数相加,如99+2=101,超过99,通过进位位调成(丢弃进位位)调整为1. 同样98+5=103,最后结果为3.
(3)如果S中的两个数相加为NM(如果丢弃进位位,则为0),则这两个码字为互补码字,其中一个为另一个的补码。
下面以10进制数为例介绍补码的概念,10进制数的基数为10,权值Q=10n ,M=1时,码字为{0,1,2,3,4,5,6,7,8,9},总共10个元素。可以看出数据对(1,9),(2,8),(3,7),(4,6),(5,5)等都是互补关系的码字,即1与9互补,2与8互补…。
同样当M=2时,S={0,1…,99},其中1与99,2与98, …, 50与50都互为补码。
(4)如果数a,b互为补码,可以称a为源码,b为a的补码,或b为源码,a为b的补码。
-
2进制数的补码
-
1位2进制数1的补码是1
-
2位2进制数的补码对: (01, 11), (10, 10),
-
3位2进制数的补码对: (001,111),(010, 110), (011,101), (100,100),
-
4位2进制数的补码对:(0001,1111), (0010, 1110),…., (1000, 1000),
-
8位2进制数的补码对:(0000_0001,1111_1111), (0000_0010, 1111_1110),…..(1000_1000,1000_1000)
-
-
补码的特点及作用
-
互为补码数相加等于NM,
-
源码与补码的关系 : (a,b)为补码对,a为源码, 补码b=NM -a =-a(在S内), 因此补码是源码的负数,
-
如10进制数 M=2时, S={0,1…99} , 如果a=41, 则补码 b=100-41=59, 在0-99的范围内,-41=59 ,这一点看起来似乎很难理解,但并不影响对负数和补码的解释。在10进制数学中,将正数、负数的范围定义在-∞—+∞,正负对称,其实只要在合理的数值空间内,正负数都是可以定义。比如10进制数-50–49的整数空间,完全符合减价运算,负数是正数的补码也很好理解。但这种定义仅仅是一种特例。-50–49范围的数可以理解为0–99的偏置,即将0–99的每个数-50得到。
-
-
可以利用补码实现减法运算
-
以10进制数为例,当M=2时,规定了数的范围S=(0,1…,99), 加法和减法的结果也必须在S的范围内,假设S中的两个数a,b相减,可以推导如下:
根据上面的讲解,式a-b =a+100-b=a+(100-b)是成立的, 而100-b恰好是b的补码,因此可以得出如下结论,在S={0,1,….,99}内的数减法可以等效为补码的加法。即a-b=a+b补
在S={0,1,….,NM-1}内的数减法可以等效为补码的加法,这个结论非常重要,特别是在2进制计算时几乎无处不在,2进制的补码也称2的补码。对于反码有时也称1的补码。
3. 2进制有符号数的补码
在2进制有符号数的计算中,一般采用对称的偏置码,即将自然码减去2M-1形成偏置码,也就是常说的2的补码,其中M是2进制数的位数。这种补码的特点是正负对应的,即+1与-1对应,+2与-2对应,从2进制来看001与111,010与110形成补码。有符号的2进制数有如下特点和规定:
(1)对称的偏置码
(2)2的补码,
- 0的补码是0
- 负数是对应正数的补码
- 正数也是对应负数的补码
(3)2进制有符号数=(正数,0,负数)=(正数,0,正数的补码)
4. 2的补码与反码的关系
上面介绍了2进制负数可以用0或正数的反码实现,而补码又可以表示负数,那么这二者之间有什么关系呢?观察表5 可以看出,由于负数的第一个值-1是源码0的反码,而补码要求-1是+1的补码,因此在排列顺序上相差1。既然可以用0或正数的反码求出负数,而负数又是正数的补码,那么是不是可以直接利用正数的反码求出补码呢? 答案是肯定的。只要将源码正数减1(将排列位置向下移动一个位置)然后求反码即可。如+1 对应的正数源码为001,将001减1变成000后求的反码为111即为001的补码。也可以将反码向上移动一个位置与正数的补码对应,如+1的2进制数为001,反码为110,补码为111,在表5中将110对应的位置向上移动一个位置即可找到111, 它们之间的关系为加1的关系,即补码为“正数源码的反码+1”。简单的说补码是正数源码取反+1。下面的两种方法都可以方便求出源码的补码,或补码的源码。
(1) (正数源码-1)取反码=补码,逆过程为 (补码)取反码+1 =正数源码。
(2)补码=(正数源码)取反+1, 逆过程为 (补码-1)取反=正数源码。
5. 有符号10进制数到2的补码变换求解
10进制有符号数到2的补码变换,可以用以下步骤利用求补码的方式实现,
(1)确定2进制数的位数,如-8–+7 确定为4位2进制数,
(1)正数的数去掉符号位直接变换成2进制数, 如-8–+7范围的数 +6—>6—> 0110
(2)0直接将对应2进制数0的左边取反,如-8–+7范围的数 0—>0000—>1000
(3)负数去掉符号位后变换成2进制数,再取反加1, 如-8–+7范围的数 -3—>3—>0011—>1100(取反)—>1101(加1)
6. 有符号数位扩展
有时为了计算需要对于有符号数的位数进行扩展,扩展的原则是,扩展后的结果应保持原数值不变,扩展原则如下:
- 0或正数在左边补0实现扩展
- 负数左边补1实现扩展
例1: 将4位有符号数(1101)2 , (0110)2 分别扩展成5,6,8位有符号2进制数
(1101)2扩展成5,6,8位有符号数分别为 (1_1101)2 ,(11_1101)2 ,(1111_1101)2 ————->注意符号位的扩展
(0110)2 扩展成5,6,8位有符号2进制数分别为 (0_0110)2 ,(00_0110)2 ,(0000_0110)2 ————->注意符号位的扩展
练习题:
- 求下列8位2进制数的反码和补码,并用十进制的正负数进行验证
(1)(1101_0010)2 (2) (0011_1010)2
2.将下列自然2进制码变换称2的补码
(1)(110)2 (2) (1011)2 (3) (01010)2 (4) (0011011)2 (5) (1011_0101)2
3. 将下列有符号的10进制数变换成8位2进制的补码,并转换成16进制数
(1) 100, (2) -126 (3) 64 (4) -128 (5)127 (6) -100 (7)-64