【软考设计师】【计算机系统】E02 原、反、补、移码

【计算机系统】E02 原、反、补、移码

  • 数据表示
    • 机器数
    • 原码
    • 反码
    • 补码
    • 移码

数据表示

机器数

机器数分类有两个维度:(1)有无符号(2)整数小数。两个维度交叉来看,有如下结论:

  • 无符号数表示正数,在机器位中没有符号位;
  • 无符号数中,若约定小数点的位置在机器数的最低位之后,则为纯整数;
  • 无符号数中,若约定小数点的位置在机器数的最高位之前,则为纯小数;
  • 有符号数机器的最高位表示正、负的符号位,其余位表示数值。

原码

已知:

  • 机器字长为 n n n,即采用 n n n 个二进制位表示数据;
  • e . g . e.g. e.g. 案例中字长 n = 8 n=8 n=8

理解方法:

  • 正整数:原码为正整数本身;
    • e . g . e.g. e.g. [ + 1 ] 原 = 00000001 [+1]_原 = 0 0000001 [+1]=00000001
  • 负整数:原码为负整数绝对值后,置第一位为1(表示为负数);
    • e . g . e.g. e.g. [ − 127 ] 原 = 11111111 [-127]_原 = 1 1111111 [127]=11111111
  • 正小数:原码为正小数本身;
    • e . g . e.g. e.g. [ + 0.5 ] 原 = 0.1000000 [+0.5]_原 = 0.1000000 [+0.5]=0.1000000
  • 负小数:原码为负小数绝对值后,置第一位为1(表示为负数);
    • e . g . e.g. e.g. [ − 0.5 ] 原 = 1.1000000 [-0.5]_原 = 1.1000000 [0.5]=1.1000000

此外,需要注意的是取值范围。已知机器字长为 n n n,而且机器数中第一位为符号位,所以取值范围为: − ( 2 n − 1 − 1 ) ≤ X ≤ 2 n − 1 − 1 -(2^{n-1}-1) \le X \le 2^{n-1}-1 (2n11)X2n11

对于上述理解方法,有如下公式:

公式如下:

  • X X X 是纯整数,则 [ X ] 原 = { X ,    0 ≤ x ≤ 2 n − 1 − 1 2 n − 1 + ∣ X ∣ ,    − ( 2 n − 1 − 1 ) ≤ x ≤ 0 [X]_原 = \begin{cases} X,\,\,0\le x\le 2^{n-1}-1\\ 2^{n-1}+|X|,\,\,-(2^{n-1}-1)\le x\le0\\ \end{cases} [X]={X,0x2n112n1+X,(2n11)x0
  • X X X 是纯小数,则 [ X ] 原 = { X ,    0 ≤ x < 1 2 0 + ∣ X ∣ ,    − 1 < x ≤ 0 [X]_原 = \begin{cases} X,\,\,0\le x<1\\ 2^0+|X|,\,\,-1< x\le0\\ \end{cases} [X]={X,0x<120+X,1<x0

反码

已知:

  • 机器字长为 n n n,即采用 n n n 个二进制位表示数据;
  • e . g . e.g. e.g. 案例中字长 n = 8 n=8 n=8

理解方法:

  • 正整数:反码为正整数本身;
    • e . g . e.g. e.g. [ + 1 ] 反 = 00000001 [+1]_反 = 0 0000001 [+1]=00000001
  • 负整数:反码为除第一位外,剩余位取反;
    • e . g . e.g. e.g. [ − 127 ] 反 = 10000000 [-127]_反 = 1 0000000 [127]=10000000
  • 正小数:反码为正小数本身;
    • e . g . e.g. e.g. [ + 0.5 ] 反 = 0.1000000 [+0.5]_反 = 0.1000000 [+0.5]=0.1000000
  • 负小数:反码为除第一位外,剩余位取反;
    • e . g . e.g. e.g. [ − 0.5 ] 原 = 1.0111111 [-0.5]_原 = 1.0111111 [0.5]=1.0111111

对于上述理解方法,有如下公式:

公式如下:

  • X X X 是纯整数,则 [ X ] 反 = { X ,    0 ≤ x ≤ 2 n − 1 − 1 2 n − 1 + X ,    − ( 2 n − 1 − 1 ) ≤ x ≤ 0 [X]_反 = \begin{cases} X,\,\,0\le x\le 2^{n-1}-1\\ 2^n-1+X,\,\,-(2^{n-1}-1)\le x\le0\\ \end{cases} [X]={X,0x2n112n1+X,(2n11)x0
  • X X X 是纯小数,则 [ X ] 反 = { X ,    0 ≤ x < 1 2 − 2 − ( n − 1 ) + X ,    − 1 < x ≤ 0 [X]_反 = \begin{cases} X,\,\,0\le x<1\\ 2-2^{-(n-1)}+X,\,\,-1< x\le0\\ \end{cases} [X]={X,0x<122(n1)+X,1<x0

补充:对于公式的理解:
如果读者对上述公式 2 − 2 − ( n − 1 ) + X 2-2^{-(n-1)}+X 22(n1)+X 不理解,有解释如下:
2 − 2 − ( n − 1 ) 2-2^{-(n-1)} 22(n1) 使得机器数中所有位的值都为1,然后 + X +X +X,等同于 − ∣ X ∣ -|X| X


补码

已知:

  • 机器字长为 n n n,即采用 n n n 个二进制位表示数据;
  • e . g . e.g. e.g. 案例中字长 n = 8 n=8 n=8

理解方法:

  • 正整数:补码为正整数本身;
    • e . g . e.g. e.g. [ + 1 ] 补 = 00000001 [+1]_补 = 0 0000001 [+1]=00000001
  • 负整数:补码为反码 + 2 0 2^0 20
    • e . g . e.g. e.g. [ − 127 ] 补 = 10000001 [-127]_补 = 1 0000001 [127]=10000001
  • 正小数:补码为正小数本身;
    • e . g . e.g. e.g. [ + 0.5 ] 补 = 0.1000000 [+0.5]_补 = 0.1000000 [+0.5]=0.1000000
  • 负小数:补码为反码 + 2 − ( n − 1 ) 2^{-(n-1)} 2(n1)
    • e . g . e.g. e.g. [ − 0.5 ] 补 = 1.1000000 [-0.5]_补 = 1.1000000 [0.5]=1.1000000

对于上述理解方法,有如下公式:

公式如下:

  • X X X 是纯整数,则 [ X ] 补 = { X ,    0 ≤ x ≤ 2 n − 1 − 1 2 n + X ,    − 2 n − 1 ≤ x ≤ 0 [X]_补 = \begin{cases} X,\,\,0\le x\le 2^{n-1}-1\\ 2^n+X,\,\,-2^{n-1}\le x\le0\\ \end{cases} [X]={X,0x2n112n+X,2n1x0
  • X X X 是纯小数,则 [ X ] 补 = { X ,    0 ≤ x < 1 2 + X ,    − 1 ≤ x < 0 [X]_补 = \begin{cases} X,\,\,0\le x<1\\ 2+X,\,\,-1 \le x < 0\\ \end{cases} [X]={X,0x<12+X,1x<0

仔细的读者会发现,补码相较于原码和反码,在取值范围上有变化。比如由 − ( 2 n − 1 − 1 ) -(2^{n-1}-1) (2n11) 变为了 − 2 n − 1 -2^{n-1} 2n1,或者说,为什么补码有 -128?

在原码和反码系统中,存在两个零,即正零和负零,这导致了一些混淆和不便。例如,对于8位二进制,+0可以表示为00000000,而-0可以表示为10000000(最高位是符号位)。这就引入了一些奇怪的数学性质,例如+0和-0的加法不等于零。

而在补码系统中,没有+0和-0的概念。这是因为补码中的最高位是用来表示符号的,所以它只有一个零,即00000000表示零,而10000000表示-128。这个表示方法消除了零的二义性,使数学运算更一致和直观。

而原码和反码表示方式,通常不再常用,因为它们引入了不必要的复杂性和不一致性。补码系统解决了原码和反码系统中的一些问题,提供了更好的数学性质和更广泛的整数表示范围,因此在计算机中广泛使用。

所以,-128 存在于补码中。将所有位取反(0变1,1变0),然后加1。
10000000 -> 01111111 + 1 = 10000000


移码

已知:

  • 机器字长为 n n n,即采用 n n n 个二进制位表示数据;
  • e . g . e.g. e.g. 案例中字长 n = 8 n=8 n=8

理解方法:

  • 正整数:移码为补码符号位取反;
    • e . g . e.g. e.g. [ + 1 ] 移 = 10000001 [+1]_移 = 1 0000001 [+1]=10000001
  • 负整数:移码为补码符号位取反;
    • e . g . e.g. e.g. [ − 127 ] 移 = 00000001 [-127]_移 = 0 0000001 [127]=00000001
  • 正小数:移码为补码符号位取反;
    • e . g . e.g. e.g. [ + 0.5 ] 移 = 1.1000000 [+0.5]_移 = 1.1000000 [+0.5]=1.1000000
  • 负小数:移码为补码符号位取反;
    • e . g . e.g. e.g. [ − 0.5 ] 移 = 0.1000000 [-0.5]_移 = 0.1000000 [0.5]=0.1000000

此外,需要注意的是取值范围。已知机器字长为 n n n,而且机器数中第一位为符号位,所以取值范围为: − ( 2 n − 1 − 1 ) ≤ X ≤ 2 n − 1 − 1 -(2^{n-1}-1) \le X \le 2^{n-1}-1 (2n11)X2n11

对于上述理解方法,有如下公式:

公式如下:

  • X X X 是纯整数,则 [ X ] 移 = 2 n − 1 + X ( − 2 n − 1 ≤ X ≤ 2 n − 1 ) [X]_移 = 2^{n-1}+X (-2^{n-1} \le X \le 2^{n-1}) [X]=2n1+X(2n1X2n1)
  • X X X 是纯小数,则 [ X ] 移 = 1 + X ( − 1 ≤ X < 1 ) [X]_移 = 1 + X (-1 \le X < 1) [X]=1+X(1X<1)

你可能感兴趣的:(#,软件设计师考试(中级),计算机系统)