• 【软考设计师】【计算机系统】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]_原 = {X,0x2n112n1+|X|,(2n11)x0
      {X,0x2n112n1+|X|,(2n11)x0
      [X]={X,0x2n112n1+X,(2n11)x0
    • X X X 是纯小数,则 [ X ] 原 = { X ,    0 ≤ x < 1 2 0 + ∣ X ∣ ,    − 1 < x ≤ 0 [X]_原 = {X,0x<120+|X|,1<x0
      {X,0x<120+|X|,1<x0
      [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]_反 = {X,0x2n112n1+X,(2n11)x0
      {X,0x2n112n1+X,(2n11)x0
      [X]={X,0x2n112n1+X,(2n11)x0
    • X X X 是纯小数,则 [ X ] 反 = { X ,    0 ≤ x < 1 2 − 2 − ( n − 1 ) + X ,    − 1 < x ≤ 0 [X]_反 = {X,0x<122(n1)+X,1<x0
      {X,0x<122(n1)+X,1<x0
      [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]_补 = {X,0x2n112n+X,2n1x0
      {X,0x2n112n+X,2n1x0
      [X]={X,0x2n112n+X,2n1x0
    • X X X 是纯小数,则 [ X ] 补 = { X ,    0 ≤ x < 1 2 + X ,    − 1 ≤ x < 0 [X]_补 = {X,0x<12+X,1x<0
      {X,0x<12+X,1x<0
      [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)

  • 相关阅读:
    Google Cloud X Kyligence|如何从业务视角管理数据湖?
    webUI自动化之元素及浏览器操作
    Error: error:0308010C:digital envelope routines::unsupported
    单点故障解决方案之Smart Link与Monitor Link
    docker swarm 布署minio集群
    代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
    linux下C语言如何操作文件(二)
    HTML 中使用 JavaScript 的具体方式
    tomcat默认最大线程数、等待队列长度、连接超时时间
    健身器材销售网站的设计与实现(SSH)
  • 原文地址:https://blog.csdn.net/weixin_43098506/article/details/133772600