有符号数表示法

Keep calm and carry on.

1.无符号数

计算机中的数均放在在寄存器中,通常称寄存器的位数为机器字长,所谓无符号数。即没有符号的数,在寄存器中的每一位均可用来存放数值。

2.有符号数

在计算机内,有符号数有三种表示法,原码、反码和补码。所有数据的运算都是采用补码进行的。
对有符号数而言,符号的“正”、“负”机器是无法识别的,但由于“正”、“负”恰好是两种截然不同的状态,如果用“0”表示“正”,用“1”表示负,这样符号也被数字化了,并且规定将它放在有效数字的前面,即组成了有符号数。

2.1原码表示法

原码是机器数中最简单的一种表示形式,符号位为0表示正数,符号位为1表示负数,数值位即真值的绝对值,故原码表示又称为带符号的绝对值表示(如下图)。
有符号数表示法
为了书写方便以及区别整数和小数,约定整数的符号位与数值位之间用逗号隔开;小数的符号位与数值位之间用小数点隔开(如上图两个数字分别应该表示成0.0011和1.1011。
整数原码定义:
有符号数表示法
小数原码定义:
有符号数表示法

根据定义我们就可以根据真值求出原码,反之已知原码求出真值。
有符号数表示法
原码表示简单明了,并易于和真值转换。但是用原码进行加减运算,却带来了许多麻烦。例如,当两个操作数符号不同且要做加法运算时,先要判断两数绝对值大小,然后将绝对值大的数减去绝对值小的数,结果的符号以绝对值大的数为准。运算步骤既复杂又费时,而且本来时加法运算却要用减法器实现。

2.2补码表示法

2.2.1 补码的概念

在日常生活中,常会遇到“补数”的概念。例如,始终指示6点,欲使它指示3点,即可按顺时针方向将分针转9圈,也可以逆时针方向将分针转3圈,结果是一致的。加入顺时针方向转为正,逆时针为负,则有有符号数表示法
由于似乎中的时针转一圈能指示12个小时,这“12”在市中坜是不被显示而自动丢失的,即15 - 12 = 3 ,故15点和3点均显示3点。这样-3 和+9对之中而言其作用是一致的。在数学上称12为模,写作mod 12,而称 +9 是 -3 以 12 为模的补数,记作
3+9(mod12) -3 \equiv+9(\bmod 12)
可见,只要确定“模”,就可以找到一个与负数等价的整数来代替此负数,这样就可把减法运算用加法实现。
上述补数的概念可以用到任意“模上”,如
3+7(mod10)-3 \equiv + 7(\bmod 10)+7+7(mod10)+7 \equiv +7 (\bmod 10) 3+97(mod102)-3 \equiv +97 (\bmod 10^2) +97+97(mod102)+97 \equiv + 97(\bmod 10^2)1011+0101(mod24)-1011 \equiv +0101(mod 2^4)
由此可得如下结论。

  • 一个负数可用它的正补数来代替,而这个正补数可以用模加上负数本身求得
  • 一个整数和一个负数互为补数时,他们绝对值之和即为模数。
  • 正数的补数即该正数本身

2.2.2 补码的定义

整数代码的定义为
[x]={0,x  2n>x02n+1+x  0>x2n [x]_补 = \left\{0,x \space\space 2^n>x\geqq0\atop 2^{n+1} +x\space\space 0>x\geqq-2^n\right .
式中,x为真值,n为整数的位数
例如:
当x = + 1010时,
[x]=0,1010[x]_补 = 0,1010
当x = -1101时,
[x]=2n+1+x=1000001101=1,0011[x]_补 = 2^{n+1} + x =100000 - 1101 = 1,0011
小数补码的定义为
[x]={x  1>x02+x  0>x1  (mod 2) [x]_补 = \left\{x\space\space1>x\geqq0\atop2+x\space\space0>x\geqq-1\space\space(\bmod\space 2)\right.
当x = 0时,
[+0.0000]=0.0000[+0.0000]_补 = 0.0000
[0.0000]=2+(0.0000)=0.0000[-0.0000]_补 = 2 +(-0.0000) = 0.0000
显然[+0][+0]_补 = [0][-0]_补 = 0.0000,即补码中的“零”只有一种表示形式
对于小数,若x = -1,则根据小数补码的定义,有[x]=2+x=10.0001.000=1.000[x]_补 = 2 + x = 10.000 - 1.000 = 1.000可见,-1本来不属于小数范围,但却有[1][-1]_补存在(其实在小数补码定义已指明),只是由于补码中的零只有一种表现形式,故他比原码能多表示一个“-1”.此外,根据补码定义,已知补码还可以求出真值。例如:
[x][x]_补 = 1.0101
x=[x]2=1.010110.0000=0.1011x = [x]_补 - 2 = 1.0101 -10.0000 = -0.1011
[x]=0.1101[x]_补=0.1101
x=[x]=0.1101x = [x]_补 =0.1101
由上述讨论可知,引入补码的概念是为了消除减法运算,但根据补码的定义,在形成补码的过程中又出现了减法。例如:
x=1011x=-1011
[x]=24+1+x=1000001011=1,0101       (1)[x]_补 = 2^{4+1} + x = 100000 - 1011 = 1,0101\space\space\space\space\space\space\space(1)
若把模x4+1x^{4+1}改写成25=100000=11111+000012^5 = 100000= 11111 +00001时,则式(1)可写成[x]=25+x=11111+00001+x     (2)[x]_补 = 2^5 +x = 11111+00001+x\space\space\space\space\space(2)
又因x是负数,若x用-x1x2x3x4x_1x_2x_3x_4表示,其中xi(i=1,2,3,4)x_i(i=1,2,3,4)不为0则为1,于是式子(2)可写成[x]=25+x=11111+00001x1x2x3x4[x]_补 = 2^5 +x = 11111+ 00001 -x_1x_2x_3x_4                           =1\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=1x1-\atop x_1x2-\atop x_2x3-\atop x3x4-\atop x_4+00001+00001
由于负数的原码为1,x1x2x3x41,x_1x_2x_3x_4,因此对这个负数求补,可以看作对它的原码除了符号位外,美味求反,末尾加1,简称“求反加1”。这样,由真值通过原码求补码就可以避免减法运算。同理对于小数也有同样的结论。
有原码除符号位外,每位求反,末尾加1求补码,在这一规则同样适用于由[x][x]_补[x][x]_原.而对于一个负数若对其原码除符号位外,每位求反,或者是对其补码减去末位的1,即得到机器数的反码

2.3反码表示法

反码通常用来作为由原码求补码或者由补码求原码的中间过渡。反码的定义如下:
[x]={0,x  2n>x0(2n+11)+x  0x>2n  (mod(2n+11)[x]_反 =\left\{ 0,x\space\space2^n>x\geqq0\atop(2^{n+1}-1)+x\space\space 0\geqq x>-2^n\space\space(mod(2^{n+1}-1)\right.
式中,x为真值,n为整数的位数
小数反码的定义为
[x]={x   1>x0(2xn)+x  0x>1  (mod(22n)[x]_反=\left\{x\space\space\space1>x\geqq0\atop(2-x^{-n})+x\space\space0\geqq x>-1\space\space (mod(2-2^{-n})\right.

3.结论

综上所述,三中机器数的特点可归纳如下:

  1. 三种机器数的最高位均为符号位。符号位和数值部分之间用“.”(对于小数)或“,”(对于整数)隔开。
  2. 当真值为整时,原码、补码和反码的表示形式均相同,即符号位用“0”表示,数值部分与真值相同。
  3. 当真值为负时,原码、补码和反码的表示形式不同,但其符号位都用“1”表示,而数值部分有这样的关系,即补码是原码的“求反+1,反码是原码的“每位求反”。

4.参考书目

  1. 《计算机组成原理》(第2版) 唐朔飞编著