介绍
计算机的世界是二进制的世界,真实世界中的数值机器不能直接进行读取和计算,需要以一种编码的方式来表达出来。
真值:现实中真实的数值,即我们正常的计数方法。
机器数:计算机中用编码表达的数值,包括原码、反码、补码、移码等。
原码
原码(true form) 是一种计算机中对数字的二进制定点表示方法.因为数值有正负之分,
原码表示法在数值的最高位增加了一位符号位(即最高位为符号位):
正数该位为0,负数该位为1。(0有两种表示:+0 和 -0),其余位表示数值的大小。
假设设机器能处理的位数为8。即字长为1byte,原码能表示数值的范围为-127 ~ 127
因为我们用了最高位来表示符号位,所以如果我们的计算机用n位来表示一个数的话,那么我们实际用来表示数字大小的只有n−1位,所以有符号位原码可以表示数的范围为
有时候我们不需要用到符号,所以我们也会有无符号数的存在,相应的也会有无符号原码,所以如果计算机用n位来表示一个数的话,那么全部数位都用来表示数的大小,所以无符号位原码可以表示数的范围为
反码
反码是数值存储的一种,但是由于补码更能有效表现数字在计算机中的形式,所以多数计算机一般都不采用反码表示数。
反码表示法规定
- 正数的反码与其原码相同
- 负数的反码是对其原码逐位取反,但符号位除外
例:3和-3的原码和反码如下
0和-0的反码如下
所以反码的0有两种表示方式,+0和-0是不一样的。
反码和原码的表示范围一样。
补码
由于原码作计算的时候的种种不便,所以引入了补码的概念
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
补码最大的作用是把减法变成了加法,让计算机可以只用一种电路就可以同时计算加法和减法,要讲解补码的原理,首先就要引入模的概念
“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。
例如:时钟的计量范围是0~11,模为12。表示n位的计算机计量范围是0 ~ 2^n - 1,模为2^n。
“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。
例如:假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨4小时,即:10-4=6;另一种是顺拨8小时:10+8=12+6=6 在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。共同的特点是两者相加等于模。
对于计算机,其概念和方法完全一样。n位计算机,设n=8, 所能表示的最大数是11111111,若再加1成为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的模为2^8。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。
- 正数的补码和其原码相同
- 负数的补码,将其对应正数二进制表示所有位取反(包括符号位),然后+1
举个例子:
为什么是取反+1?
举例:在8位计算机下,1的原码是 0000 0001,-1的原码是1000 0001,
此时1 + (-1) = 1000 0010,并不等于0。
补码的作用是把减法变成了加法,所以1 + (-1) 应该等于0才对。
即: 0000 0001
+ ?
0000 0000
这样可以计算出?处这个值应该是1111 1111才对
0000 0001
+1111 1111
0000 0000
因为是8位,最高位会溢出,所以计算的结果等于0。
这样可以推算出-1的补码表示就是1111 1111。
1000 0001
负数的反码是对其原码逐位取反,符号位除外,所以-1的反码表示为1111 1110
可以看出-1的反码 + 1 = 补码。
多测试几个值之后可以得出这个规律,负数的补码 = 反码 + 1。
-1取绝对值为1, 1的原码为 0000 0001,全部按位取反为1111 1110,再+1 = 1111 1111
所以负数的补码 = 对应正数按位取反(包括符号位) + 1。
下面看一下-128的补码表示,应该是128二进制按位取反 + 1 。
128的二进制为1000 0000,按位取反得到0111 1111,+1得1000 0000。
所以1000 0000这个数表示-128,而不是表示128,因为第一位是符号位。
而在原码里面1000 0000表示的是-0,那么我们看看-0的补码表示。
-0的补码应该是0000 0000按位取反 + 1 ,得1111 1111 + 1 = 1 0000 0000,
因为是8位处理器,这里会产生溢出现象,最后结果依然是0000 0000,所以补码里面+0和-0的表示是一样的。
这样补码可以表示的范围是比原码要多一位的。即
移码
移码(又叫增码或偏置码)通常用于表示浮点数的阶码,其表示形式与补码相似,只是其符号位用“1”表示正数,用“0”表示负数,数值部分与补码相同。
移码常用来比较大小,计算移码只要将补码的符号位取反即可。
例:1的补码是0000 0001,-1的补码是1111 1111,
那么1的移码是1000 0001,-1的移码是0111 1111,
这样直接比较大小一目了然
总结
- 三种机器数的最高位均是符号位
- 当真值为正数的时候,原码、补码、反码的表示均相同;
- 当真值为负数的时候,三种机器数的表示方式都不同,但是符号位都是1,数值部分,补码是原码的“求反+1”,反码是原码的“除符号位,每位取反”