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≡+7(mod10)+7≡+7(mod10)−3≡+97(mod102)+97≡+97(mod102)−1011≡+0101(mod24)
由此可得如下结论。
- 一个负数可用它的正补数来代替,而这个正补数可以用模加上负数本身求得
- 一个整数和一个负数互为补数时,他们绝对值之和即为模数。
- 正数的补数即该正数本身
2.2.2 补码的定义
整数代码的定义为
[x]补={2n+1+x 0>x≧−2n0,x 2n>x≧0
式中,x为真值,n为整数的位数
例如:
当x = + 1010时,
[x]补=0,1010
当x = -1101时,
[x]补=2n+1+x=100000−1101=1,0011
小数补码的定义为
[x]补={2+x 0>x≧−1 (mod 2)x 1>x≧0
当x = 0时,
[+0.0000]补=0.0000
[−0.0000]补=2+(−0.0000)=0.0000
显然[+0]补 = [−0]补 = 0.0000,即补码中的“零”只有一种表示形式
对于小数,若x = -1,则根据小数补码的定义,有[x]补=2+x=10.000−1.000=1.000可见,-1本来不属于小数范围,但却有[−1]补存在(其实在小数补码定义已指明),只是由于补码中的零只有一种表现形式,故他比原码能多表示一个“-1”.此外,根据补码定义,已知补码还可以求出真值。例如:
若[x]补 = 1.0101
则x=[x]补−2=1.0101−10.0000=−0.1011
若[x]补=0.1101
则x=[x]补=0.1101
由上述讨论可知,引入补码的概念是为了消除减法运算,但根据补码的定义,在形成补码的过程中又出现了减法。例如:
x=−1011
[x]补=24+1+x=100000−1011=1,0101 (1)
若把模x4+1改写成25=100000=11111+00001时,则式(1)可写成[x]补=25+x=11111+00001+x (2)
又因x是负数,若x用-x1x2x3x4表示,其中xi(i=1,2,3,4)不为0则为1,于是式子(2)可写成[x]补=25+x=11111+00001−x1x2x3x4 =1x1−x2−x3−x4−+00001
由于负数的原码为1,x1x2x3x4,因此对这个负数求补,可以看作对它的原码除了符号位外,美味求反,末尾加1,简称“求反加1”。这样,由真值通过原码求补码就可以避免减法运算。同理对于小数也有同样的结论。
有原码除符号位外,每位求反,末尾加1求补码,在这一规则同样适用于由[x]补求[x]原.而对于一个负数若对其原码除符号位外,每位求反,或者是对其补码减去末位的1,即得到机器数的反码。
2.3反码表示法
反码通常用来作为由原码求补码或者由补码求原码的中间过渡。反码的定义如下:
[x]反={(2n+1−1)+x 0≧x>−2n (mod(2n+1−1)0,x 2n>x≧0
式中,x为真值,n为整数的位数
小数反码的定义为
[x]反={(2−x−n)+x 0≧x>−1 (mod(2−2−n)x 1>x≧0
3.结论
综上所述,三中机器数的特点可归纳如下:
- 三种机器数的最高位均为符号位。符号位和数值部分之间用“.”(对于小数)或“,”(对于整数)隔开。
- 当真值为整时,原码、补码和反码的表示形式均相同,即符号位用“0”表示,数值部分与真值相同。
- 当真值为负时,原码、补码和反码的表示形式不同,但其符号位都用“1”表示,而数值部分有这样的关系,即补码是原码的“求反+1,反码是原码的“每位求反”。
4.参考书目
- 《计算机组成原理》(第2版) 唐朔飞编著