• 【计算机组成】数据表示


    基本概念

    在学习原码,反码、补码和移码之前,需要先了解机器数和真值的概念。

    • 机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
      比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。
      那么,这里的 00000011 和 10000011 就是机器数。

    • 真值:因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

      例如:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

    • 真值:+0101,-0100;
    • 机器数:([x]_原)=0101

    机器数

    关于原码、反码和补码的详解,请看:原码、反码、补码的使用及其原理

    • 原码:x = -0101,([x]_原) = 1101
    • 反码:x = -0101,([x]_反) = 1010
    • 补码:x = -0101,([x]_补) = 1011
    • 移码:x = -0101,([x]_移) = (2^n) + x = 0011

    理解:
    补码是为了化减法为加法方便计算机设计运算;
    移码是为了方便比较大小,用在浮点数的阶码中。

    • 补码——任何一个有模的系统中,减法都可以通过加其补码来表示。最简单的例子就是以 12 为模的钟表,比如现在是 3 点,那么-5个小时就等于 +7 个小时,都是 10 点。这里 7 就是 5 的补码。
    • 移码——数据对应关系一次挪动一下位置,使得看起来小的数真值也小。比如原本 0000 表示 0,现在表示 -128,然后 0001 表示 -127,一直到 1111 表示 +127,这样就方便比较了。

    定点数与浮点数

    关于浮点数的详解,请看:浮点数在计算机中的表示与转二进制

    • 定点数:小数点固定 x.xxxxxx,表示范围受限,忘掉它吧
    • 浮点数:数的范围和精度分别表示。
      • 一般格式:EEEE......EMMM.......M,E 部分是阶码(数的范围 i),M 部分是尾数(数的精度)。
        缺点:阶码和尾数位数不固定,太灵活了
      • IEEE754 格式:跟我背下来----
        32 位的是(单精度):1位符号位S + 8位偏指数E + 23位有效尾数M,偏移值为 127。
        64 位的是(双精度):1位符号位S + 11位偏指数E + 52位有效尾数M,偏移值为 1023。
        真值就是(32位为例) (N = (-1)^S * 2^{(E-127)} * 1.M)

    浮点数的特殊情况:

    • E = 0, M = 0:机器零
    • E = 255, M = 0:无穷大,对应于 x/0
    • E = 255, M != 0:非数值 NaN,对应 0/0

    数据校验

    基本原理:增加冗余码

    • 码距:合法编码之间不同二进制位数的最小值
    • 码距与检错、纠错能力:
      • 码距 d >= e+1:检查 e 个错误
      • 码距 d >= 2t+1:纠正 t 个错误
      • 码距 d >= e+t+1:同时检查 e 个错误,并纠正 t 个错误。(e >= t)

    理解:增加码距就是增加非法编码的数量,看到非法编码就算检查出错误了,而非法编码距离哪个合法编码比较进就认为正确的应该是什么(简单理解,可参考下面的图),也就是可以纠正错误。

    这里看到过一个好的几何理解图,仔细品味下:

    举个例子:比如一共有 8 位,码距为 1 则检查不出任何错误,因为所有编码都是合法编码。如果码距为 2,那合法编码应该像 00000000, 00000011, 00001100, 00001111 这样,那如果出现 00000001 这样的非法编码就出错了,可检查一位错,但如果两位同时错了,则有可能又跳到另一个合法编码上了,就检查不出 2 位错。

    那如果码距是 3,那合法编码应该像 00000000, 00000111, 00111000, 00111111 这样,那如果出现一位错 00000001,或者两位错 00000011,都是非法编码,都能检查出错误,并且此时可以纠正 00000001 为 00000000,纠正 00000011 为 00000111。但是三位同时错就检查不出了。

    • 常见校验策略:奇偶校验、CRC校验、海明校验

    ps:海明编码最强视频演示教程:https://www.youtube.com/watch?v=373FUw-2U2k

  • 相关阅读:
    mysql分表技术(学习心得)
    Linux下搭建DNS服务器
    php简单单例模式
    JQuery的ajaxFileUpload图片上传初试
    Binary Tree Level Order Traversal II
    Remove Element
    Symmetric Tree
    Balanced Binary Tree
    Power of Two
    Merge Two Sorted Lists
  • 原文地址:https://www.cnblogs.com/blknemo/p/12811110.html
Copyright © 2020-2023  润新知