微机机器数的原码、反码、补码
一、相关基础知识
机器数:在机器中,用二进制表示有符号数,用最高位表示符号,其余的为数值位,这样一组连同符号也编码化的二进制数称为机器数。(符号位0为正,1为负)
真值:机器数所代表的数值大小称为机器数的真值( 即实际的值,有正负,例如1000 0001的真值为 = –000 0001 = –1,1000 0001即为机器数)。
二、具体内容
1.原码(True Form)
在机器数中最高位为符号位,符号位为0表示正数,符号位为1表示负数,其余为该数的绝对值,这种表示方法 就称为原码。
例如:
8位二进制原码表示数的范围是-127到+127,即-2^7-1到2^7-1,最高位为符号位
0的原码有两种表示方法,即+0和-0,设字长为8位
【+0】原= 0000 0000B
【-0】原=1000 0000B
采用原码表示法时,编码简单直观,与真值转换方便,便于人识别,但也带来一些麻烦
一:是引起机器中零的表示不唯一,零有二义性,给机器判零带来麻烦,必须在设计时约定好机器采用正零或负零
二:是不便于进行加减运算,用原码进行四则运算时,符号位需单独处理,而且原码加减运算规则复杂。
N位二进制原码的表示范围为-(2-1)到+(2-1)
2.反码(One’s Complement)
正数的反码与原码相同。
负数的反码等于原码除符号位外,其余各位按位取反。即符号位依旧是0正1负,其余的取反
例如:
0的反码也有两种表示方法,即+0和-0,设字长为8位
【+0】原= 0000 0000B (与原码相同)
【-0】原=1111 1111B (符号位相同,其余取反)
N位二进制反码的表示范围为-(2-1)到+(2-1)
3.补码(Two’s Complement)
正数的补码表示与原码相同,即【X】补=【X】原=【X】反
负数的补码等于它的反码加1,即在其反码的最低位加1就为该数的补码
例如:
0的补码只有一种就是 0000 0000,无论+0或者-0,在补码中也应没有-0的概念
而原可表示-0的1000 0000 则表示为-128,则可多表示一个数,所以位于4位int型,可以表示范围是: [-231, 231-1]
N位二进制补码的表示范围为-2到+(2-1)
三、分析总结
也即正数以原码存储,负数以补码存储,符号位0为正1为负,0的存储形式只有+0为0000 0000,没有-0,1000 0000表示-128,为2^(N-1)
为何计算机有原码、反码、补码?
首先对于原码,人眼可很快根据最高位识别出一个数的正负且进行正确的加减运算,例如一个正数加上一个负数,我们能很快辨别出是等于这个正数减去负数的绝对值,但对于计算机,为设计简单,在计算机中只有加法器,没有减法器,CPU只会做加法,若用2个原码或反码进行相应加法则运算会发生错误,所以由相应的规定人为可以很轻松看出真值的原码,到规定计算机原码到补码转化过程中的反码,再到最后规定了可只用加法器就能进行正确运算的补码,所以计算机中的所有数都是补码形式进行存储!(基本可以这样认为,负数用补码表示,正数的原码等于补码)
总之采用补码可用加法的运算代替减法运算,从而可以简化硬件结构,降低成本!
为什么以补码形式存储能让CPU进行正确运算?
形象的可解释为在日常生活中,如钟表系统,若当前世界为10点,我想将时间调回8点,第一种方法是往回拨即逆时针旋转2小时、旋转14小时、旋转26小时。。。。。
第二种方法是往前拨即顺时针旋转10小时、旋转22小时、旋转34小时。。。。。
若顺时针拨为正,逆时针为负则用数字表示即调时间方法为:
10时-2时=8时 10时+10时=20时=8时 也即 10-2=8 10+10=8
很巧妙的将10减2变成了加10,因为时针是圆的,时针一圈为12小时,上午8点与晚上20点在时针上的位置是一样的,因为他们相差12小时,20点减去一个周期12小时即得到了8点
这在数学上称其为共模同余,其中12称为时针技术系统的模,也即10-2=10+10(Mod 12)
计算机也正是用这以数学思想,巧妙的将原来本是减法运算转换成可进行正确的加法运算
也就是说假设是在当模为12时,我们需要计算机进行10-2的运算,计算机将10存为补码10,-2存为补码10,然后进行相加,所得的结果为20,由于超过了位码,舍去了计数器的一个最高位也即模的大小,即12,剩下位数为8,8依旧为补码,再转换成原码输出给我们,为8(不过计算机采用的模不是12,而是2!)
对于字长为N位的二进制计数系统,某一个数X,其绝对值小于模数|X|<2,补码定义如下:
【X】补=2+X
若X为正数,即0《X<2-1,则【X】补=2+X=X,因为计数器加上2,超过位数,自然丢失这一位,等于没加,见后例
若X为负数,即-2《X《0,则【X】补=2+X=2-|X|,即该数补码为模减去该负数的绝对值(这也形象说明计算机采用的是共模同余的这种数学思想,虽然计算机无法进行2-|X|这种减法运算,不过计算机能够判断符号位是0还是1,以及将1变成0,0变成1,也能进行加1操作,进行这些操作也即是负数的补码是等于它的反码加1)
通过这样定义的补码存储在计算机当中,当进行运算时若有超过模的部分位数会被自然丢失,剩下位数所得结果再转换成相应的原码即为正确运算结果
四、实例测试
例:
计算64-10=?
在字长为8为的二进制计数器系统中
64的补码为: 0 100 0000B
-10的原码为:1 000 1010B
-10的反码为:1 111 0101B
-10的补码为:1 111 0110B
然后将2数的补码相加:
0100 0000=【+64】补
+ 1111 0110=【-10】补
1 0011 0110=【+54】补
1由于为8位系统,被自然丢失!0011 0110表示的补码原码也为0011 0110,即表示+54,也与事实相符