关于计算机系统中的原码,移码,补码和变形补码的学习

定点数的编码有原码,补码,反码,移码,

 

原码

原码是符号位的不同,正数符号位为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表示负溢出,即下溢,

反码

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值