关于计算机系统中的原码,移码,补码和变形补码的学习
定点数的编码有原码,补码,反码,移码,
原码
原码是符号位的不同,正数符号位为0,负数符号位位为1,数值部分是不变化的,比如0的表示为0000(以4位说明),-0的表示为1000,1的表示为0001,-1的表示为1001,表示很简单而且也容易理解,但是这种编码有很多缺陷,比如
1.0的表示不唯一,不利于编程;
2.他的加减运算方式不统一,即不能用加法来表示减法,运算程度复杂
3.需要对符号位进行处理,不利于硬件设计(目前还不够理解)
4.尤其是当a<b时,a-b的实现将很困难。
因此如今的整数都用补码表示,但是浮点数的尾数用原码定点小数表示。
移码
移码是将每一个数值加上一个偏置常数(bias),通常,当编码位数为n时,bias取2^(n-1)或者2^(n-1)-1(如在IEEE754)
比如说n=4时,E(biased)=E+2^3
比如-8 的-8(+8)~0000B
在这种形式的编码中,0的编码是唯一的,当bias为2^(n-1)时,移码和补码只有第一位是相反的,
移码的作用:用来表示浮点数的阶,这么做的原因是便于浮点数加减运算时的对阶操作,即比较大小
比如:
1.01*2^-1+1.11*2^3
如果用补码来表示阶数,则-1的补码在机器中是111,3的补码是011,在机器中直接比较是111>011,不符,
而用移码可以解决这个问题,移码的-1表示为011(3),而3的表示为111(7),符合实际,
补码
首先先掌握一个重要概念,在一个m模运算系统中,一个数与它除以模后的余数等价
比如在模12系统中,-4和8,10-4=10+8(mod12)
-4=8(mod12)
则8是-4对模12的补码,
由此可以得出两个结论,一个负数的补码等于模减该负数的绝对值。
对于某一确定的模,某数减去小于模的另一个数,总可以用该数加上另一数负数的补码来代替。
补码达成了+和-的统一,
9828-1928
=9828+(10^4-1928)
=9828+8072
= 17900
=7900(mod 10^4)
而计算机中的运算器是模运算系统,
在八位二进制加法器模运算系统中,[-0100 0000]的补码为=(2^8- 0100 0000)=1100 0000,可以直接计算,也可以记住一个规律
即一个负数的补码等于将对应正数的补码各位取反,末位加一,也可以说是从右向左遇到的第一个1的前面各位取反。
以下展示一个利用补码将减法化为加法的例子:
0111 1111-0100 0000=0111 1111+(2^8-0100 0000)=0111 1111 + 1100 0000=1 0011 1111(mod2^8)=0011 1111
运算器是只有有限位的,假设为n位,则运算结果只能保留到n位,模为2^n
假设补码有n位,则有
[X]补= 2^n + X (-2^n≤X<2^n ,mod 2^n)
补码为正数,则符号位为0,补码为负数,则符号位为1;
X是真值,[x]补是机器数,真值是现实生活中的值,
而机器数是在机器里面用补码表示的值。
然后,还有一个变形补码,
在补码的运算中,中间结果可能会溢出,因此产生了变形补码,变形补码为双符号位,作用就是存放可能溢出的中间结果,
比如四位二进制数,
首先,变形补码的最高位总是表示正确的符号,比如00作为符号位表示正数,01表示正溢出,即上溢,11表示负数,10表示负溢出,即下溢,
反码
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。