计算机组成原理——有符号数的原码、反码、补码、移码

目录

原码

浮点数和定点数

无符号数/有符号数的定点表示

原码

反码 

补码

作用

移码

作用


原码

浮点数和定点数

定点数:小数点的位置固定 如:13.24                   ——常规计数

浮点数:小数点的位置不固定 如:1.0023*10^2    ——科学计数法

无符号数/有符号数的定点表示

无符号数:整个机器字长的全部二进制均为数值位,没有符号位,相当于数的绝对值
如:10110B=1*2^4+0*2^3+1*2^2+1*2^1+0*2^0=22D
表示范围:

2^{11}2^{10}2^92^82^72^62^52^42^32^22^12^0
204810245122561286432168421

为确定无符号数的表示范围,必须要规定其有效位数,假设使用8位二进制数,共有2^8种状态,表示范围为[0,2^8-1](0000\;0000-1111\;1111)。n位的无符号数所表示的范围为[0,2^n-1]

有符号数的定点表示:
定点整数:

定点小数:

符号位通常0表示正,1表示;数值部分也称为尾数 

原码

原码:用尾数表示真值的绝对值,符号位“0/1”对应“正/负”。若机器字长为n+1,则尾数占n位。

若要用原码表示定点整数17(机器字长8)则为:000010001
若要用原码表示定点小数-0.75(机器字长8)则为:11100000

原码整数的范围:

若机器字长n+1位,原码整数的表示范围:-(2^n-1)\le x \le 2^n-1(关于原点对称)
机器字长有n+1位,本来可以有2^{n+1}种状态,而表示的范围共有2^{n+1}-1种数值,就是因为真值0有+0(000...0)和-0(1000...0)两种形式。

原码小数的范围
若机器字长n+1为,原码小数的表示范围:-(1-2^{-n})\le x \le 1-2^{-n}(关于原点对称),和定点整数一样,真值0有+0(000...0)和-0(100...0)两种形式。

反码 

若符号位为0,则反码与原码相同;若符号位为1,则数值位全部取反

如(机器字长8位):
+17                                                                   -17
原码:00010001                                              原码:10010001
反码:00010001                                              反码:11101110
+0.75                                                                -0.75
原码:01100000                                              原码:11100000
反码:01100000                                              反码:10011111

反码整数的表示范围:

若机器字长为n+1位,反码整数的表示范围为-(2^n-1)\le x \le 2^n-1(关于原点对称),由于真值为0的原码有两种表示形式+0(000...0)其反码为(000...0),-0(100...0)其反码为(111...1),由此真值为0的反码也有+0和-0两种形式。

反码小数的表示范围:

若机器字长为n+1位,反码小数的表示范围为-(1-2^{-n}) \le x \le 1-2^{-n}(关于原点对称),真值为0的反码也有+0和-0两种形式。

反码只是原码转为补码的中间过渡态,实际上并没有什么太大的用处。

补码

若符号数位0,则补码与原码相同,若符号位为1,则补码等于反码末位+1(要考虑进位)。

如(机器字长8位):
+17                                                                   -17
原码:00010001                                              原码:10010001
反码:00010001                                              反码:11101110
补码:00010010                                              补码:11101111
+0.75                                                                -0.75
原码:01100000                                              原码:11100000
反码:01100000                                              反码:10011111
补码:01100001                                              补码:10100000

补码整数的表示范围:

若机器字长为n+1位,对于特殊的0,+0的反码为000...0,其补码也为000...0,而对于-0,他的反码为111...1,他的补码为1000..0由于考虑进位,他的补码有n+2位,但是我们是用n+1位字长的机器码,所以第n+2位会被舍弃,也就是说-0的补码为000...0和+0的补码是一样的,即0的补码是唯一的000...0。在000...0~111...1状态中,补码100...0无对应的原码(因为0的补码只有唯一的形式)因此,我们认为规定100...0为-2^n的补码。由于机器字长为n+1,能表示的范围为,[-(2^n-1),2^n-1],由于补码人为将1000...0规定为-2^n的补码,因此补码的整数的表示范围为[-2^n,2^n-1],比原码多了1个。

补码小数的表示范围:
如上所述,在此将100...0定为-1的补码,因此补码小数的表示范围为[-1,1-2^{-n}]

将负数的补码转回为原码:尾数取反+1

作用

补码的作用就是将减法变为等价的加法运算,使ALU无需集成减法器,以降低硬件的要求,减少成本

原理:

当对原码进行加减运算的时候,如果是一个正数+一个负数,我们需要将这个运算转为一个正数减去另一个正数,这就要求计算机有一个减法器才能完成。而减法器的电路设计比加法器困难的多,也就是说减法器的需要求会增加计算机硬件要求,计算机成本也会随之增加。

有人就提出用加法来代替减法,这样就可以减少计算机硬件的成本了。

在此以时钟为例,指针指向的10如何能指向7

 正常的想法就是逆时针拨3个单位

   这就相当于进行了10-3的操作

而另外一种(只考虑旋转角度小于360的)方法是顺时针拨9个单位

   这就相当于进行了(10+9)%12的操作(时钟盘面只有12个单位)

由于 -3\equiv9(mod\;12),不难看出-3和+9在模12的条件下是等价的。在模12运算中,-15、-3、9、21是属于同一个等价类的(详细搜索离散数学等价类)。

由于 3 < 12 && 9 < 12 && |-3|+|9|=12,则我们称-3和9互为补数。也就是说互为补数的两个数的绝对值之和等于模数,并且两个数的绝对值都小于模数。

由此,在(mod m)的条件下,若能找到负数的补数,就可以用正数的加法来代替减法。

补数 = 模 - 负数的绝对值

以下我们规定定点整数的机器字长为8位,则最多能表示的数为0000\;0000-1111\;11110-2^8-1。若某个运算使得最终的结果的二进制数位大于8位,则会舍弃溢出的部分,保留8位有效的数位,实际上这就是一个mod\;2^8运算。如1111 1111 + 10 = 1 0000 0001保留8位有效数位后,结果为0000 0001。

由于计算机天然的模运算,所以我们可以将减法转为对应补数的加法,若要计算14-14(0000 0111 + 1000 0111)根据上述补数的计算公式得到

                                 -14的补码 = 模数(1 0000 0000) - (-14)的绝对值(0000 0111)

最终转为加法的计算式子为:14+(-14的补码) = 0000 0111 + 1111 1001 = 1 0000 0000
保留8位后结果为0。

之前说的补码等于反码+1,这并不是补码原生的定义,而是为了方便计算补码而得出的拿11000110来举例,他的绝对值为01000110,加上10111001则可以得到11111111再+1即可得到模数2^8 所以补码为10111001(数位取反获得1111 1111)+1得到(1 0000 0000)。

移码

在补码的基础上将符号位取反。注意:移码只能用于表示整数

+17                                                                   -17
原码:00010001                                              原码:10010001
反码:00010001                                              反码:11101110
补码:00010010                                              补码:11101111
移码:00010010                                              移码:01101111

由于移码是由补码得到的,对于0,他的补码只有一种形式,因此0的移码也只有唯一的形式1000...0

若机器字长n+1位,移码整数的表示范围为[-2^n,2^n-1]。(移码和补码是一一影射的)

作用

 若将移码的所有二进制位看作一个无符号数,那么移码随真值的增大而增大,根据此性质,可以通过移码进行整数的大小比较。

黄大牙牙yyds

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值