天天看点

计算机组成原理:原码,补码,反码,移码

无符号数

寄存器的位数反映和决定无符号数的表示范围

比如八位的寄存器就只能储存十进制的0-255

有符号数

机器数与真值

计算机组成原理:原码,补码,反码,移码

在计算机当中没有硬件表示小数点的位置,而小数点的位置是我们自己约定的,

小数的时候,小数点的位置默认是在符号位的后面,符号位在寄存器的最高位,

整数的时候,小数点的位置默认是寄存器最低位的后面

原码表示法

整数

计算机组成原理:原码,补码,反码,移码

这里x表示需要表示的值,而n表示的是存储整数n需要的位数,例如:

计算机组成原理:原码,补码,反码,移码

小数

计算机组成原理:原码,补码,反码,移码

原码的特点: 简单、直观 但是用原码作加法时,会出现如下问题:

计算机组成原理:原码,补码,反码,移码

能否只作加法?

找到一个与负数等价的正数来代替这个负数,就可使减变成加 ,下面就是解决方案:补码

补码

补的概念

比如时钟,现在是六点,你要转到3点,有两种方法:

减法:6-3=3

加法:6+9=15=3点

所以这里+9和-3的效果是一样的,减法可以变换成加法

称 + 9 是 3 以 12 为模的 补数

结论:

一个负数加上“模”即得该负数的补数

一个正数和一个负数互为补数时,它们绝对值之和即为模数

计算机组成原理:原码,补码,反码,移码

正数的补数即为其本身

计算机组成原理:原码,补码,反码,移码

这时我们就发现,寄存器的位数为4位,模是16的两个数-13和3,

它们的补数都是3,正数的补码是本身

但是我们如何区别这个补码是正数的还是负数的补码呢?

我们发现,如果是加上2^(n+1),n表示数值的位数,

2^(4+1)+(-1011)=100000-1011=10101

2^(4+1)+0101=100000+0101=100101=00101(第六位去掉,现在我们是寄存器是五位)

所以我们想使用一位来表示这个补码是正数还是负数

补码定义

整数

x是实际的值,n表示的是整数的位数,n+1是寄存器的位数,因为有一位来存储符号了

这样当是正数的时候,补码的符号位是0,负数的时候补码符号位是1

计算机组成原理:原码,补码,反码,移码

小数

计算机组成原理:原码,补码,反码,移码

求补码的快捷方式

x = 1010 时

前面的公式求补码的方式:

[x]补 =2^(4+1) - 1010 =100000-1010=10110

我们也可以换一种思维:

[x]补 =(11111+1)-1010=(11111-1010)+1=10101+1=10110

因为11111和任何比它小一位的数字相减,都是前面第一位是1后面取反

所以我们得出一个求补码的快捷方式:

当真值为负时,补码可用原码除符号位外每位取反,末位加1求得

它反过来也成立:

当真值为负时,原码可用补码除符号位外每位取反,末位加1求得

练习:

真值:0.0000

补码:0.0000

原码:0.0000

真值:-0.0000

补码:0.0000

原码:1.0000

真值:-1.0000(注意这里是小数)

补码:根据定义:2+x=10.0000-1.0000=1.0000

原码:无法表示

反码

整数

反码就是负数的时候原码的每个位置反过来,所以就是比补码少了一个+1,

定义中就是模=(之前的模-1)

和之前一样,x是真值,n是整数的位数,n+1是寄存器的位数

计算机组成原理:原码,补码,反码,移码

小数

计算机组成原理:原码,补码,反码,移码

例子:求 0 的反码

假设x=+0.0000

反码:0.0000

x=-0.0000

反码:1.1111

x=+0

反码:0,0000

x=-0

反码:11111

三种机器数总结

  1. 最高位为符号位,书写上用“,”(整数) 或“.”(小数)将数值部分和符号位隔开
  2. 对于正数,原码 = 补码 = 反码
  3. 对于负数,符号位为1,其数值部分

    原码除符号位外每位取反末位加1变成补码

    原码除符号位外每位取反变成反码

    设机器数字长为 8 位(其中1位为符号位) 对于整数,当其分别代表无符号数、原码、补码和 反码时,对应的真值范围

    计算机组成原理:原码,补码,反码,移码

已知[y]补码,求[-y]补码

假设y补码=y0. y1 y2 … yn

如果y补码表示一个小数而且是正值:y补码:0.y1 y2 …yn

那么y就是:0.y1 y2 …yn

-y就是:-0.y1 y2 …yn

-y的补码就是:1.^ y1^ y2…^ yn + 2^-n ( ^y1表示y1的取反)

所以y的补码就是-y的补码连同符号位在内,每一位取反,末位加一得到的

下面再来假设y的补码表示的是负数

y的补码=1.y1 y2 …yn

y的原码1.^ y1^ y2…^ yn + 2^-n ( ^y1表示y1的取反)

y的值:-(0.^ y1^ y2…^ yn + 2^-n)

-y的值(正数,补码一样):0.^ y1^ y2…^ yn + 2^-n

所以上面的结论是正确的

移码

补码表示很难直接判断其真值大小 ,比如

十进制31 和-31

二进制+11111和-11111

补码011111和100001,这样比较不了大小

而我们不是2^(n+1)+x,改变成2 ^n +x

那么就变成111111 和000001

这样比较就是31大于-31了

其实这样就是移码

定义

注意,移码只有整数的定义,没有小数的定义

[x]移 = 2^n + x(2n>x ≥ 2n)

x 为真值,n 为 整数的位数

相当于在真值上集体移动了2^n

计算机组成原理:原码,补码,反码,移码
计算机组成原理:原码,补码,反码,移码

移码和补码的比较

计算机组成原理:原码,补码,反码,移码
计算机组成原理:原码,补码,反码,移码

移码的特点

计算机组成原理:原码,补码,反码,移码

继续阅读