组成原理(二)数据表示和计算

第二章 数据表示和计算

2.1 进制的转换

  1. 十进制转换为二进制
    (1)除2取余法(整数部分)
    对十进制的数不断除2求余,直到商为0。先求得的余数是二进制的低位
    ((327)_{10})转换:转换为 ((101000111)_2)

    第n次除2后的商 余数
    | 163 |   1
     |81       | 1
     |40          |1
     |20           |0
     |10            |0
     |5             |0
     |2       |1
     |1        |0
     |0              |1
    

(2)减权定位法(整数部分)
一个数减去2的几次方,用余数再次减去2的几次方
((327)_{10})转换:

|减权|定位|
|:----------:|:-----:|
   | 327  -  256  = 71 |   1
    |71  <  128          | 0
    |71 -64 = 7           |1
    |7  <  32             |0
    |7  <  16             |0
    |7  <  8              |0
    |7  -  4  =  3        |1
    |3 - 2  =  1          |1
    |1-1=0                |0

(3)乘2取整法
把小数不断地乘2,取每次结果的整数,直到结果为1
((0.8125)_{10} 转换为 (0.11.1)_2)

|乘2|取整|
|:-----:|:--------------:|
|0.8125 * 2 = 1.625 |1
|0.625 * 2 = 1.25|1
|0.25 * 2 = 0.5|0
|0.5 * 2  = 1.0| 1

1.2 真值和机器数

  1. 真值:正负号+某进制数绝对值的形式称为真值

  2. 机器数:符号位用0表示正号,-1表示符号

  3. BCD码表示十进制数
    (1)8421码
            十进制中的每一位数字分别用8421(4bit)表示。eg:63表示为8421码
            6(0110)3(0011)
    (2)2421码
            十进制中的每一位数字用2421(4bit)表示
            6(1100)3(1001)
    (3)余3码
            每一位十进制数对应的二进制都加上011
            6(1001)3(0110)
    (4)BCD码的计算
            BCD码的计算,把每4位二进制分为一组,组与组之间进行运算,逢十进一。
            和小于9的时候不调整:
            和大于9的时候加6 ((0110)_2)进行修正

  4. 汉字的显示
    (1)汉字在屏幕上使用点阵显示,采用1616的点阵。每个点采用1或者0表示是否点亮,所以一个汉字需要占用显存162byte

  5. 奇偶校验

  6. 汉明码校验(适合信道良好的环境)
    (1)主存和cpu进行数据交换时,检测数据交换的是否正确,能检测出一位出错,并能知道是哪一位出错。
    (2)主要是通过检测第2^i位置,1的个数是偶数还是奇数
    (3)数据位m位,校验位k位,只要2^k>m+k+1即可
    (4)编码步骤:
            a) 数据位 -> 计算出检测位多少位(2^k>m+k+1)
            b) 计算机校验位公式
            c) 算出检测位的值

  7. CRC校验
    (1)在硬盘和主机进行数据交换时校验
    (2)解决的问题:
            a)数据位是n位要增加多少位的校验位呢?校验位个数和数据位个数无关
            b)通讯双方有一个约定:生成多项式(k+1位),k是校验位的位数
            c)由数据位和生成多项式产生CRC编码
    (3)数据位和生成多项式是已知的,要产生CRC编码,只有校验位不知道。产生校验位的方法就是模二计算
    (4)模二计算:没有进位也没有借位的计算(有加减乘除的模二计算),模二加减法运算相当于异或操作,相同的数相加为0,不同的数相加为1
    (5)校验码就是用模二除法计算得来
    (6)如何生成CRC码

    (1)设数据位m(x)为100占3位,约定生成多项式g(x)100占3位
    (2)则校验位占2位,就是说模二除法的余数占2位
    (3)用数据位m(x)除以生成多项式g(x)得到余数r(x)
    (4)过程:因为余数占2位,所以把数据位向左移动2位。m(x)x^k,即数据位编程10000,
    接着,用100000模二除以101,得到商101,余数01,即r(x)=01,得到CRC编码为m(x)
    x^k + r(x),即最终的CRC校验码为10000+01=10001,所以发送的10001比特位在接收端除以生成多项式的余数为0,表示传输没错 。
    (5)公式上的推导:
         (frac{m(x)*x^k}{g(x)} = Q(x),r(x)) //Q(x)是商,r(x)是余数
         所以(m(x)*x^k = g(x)*Q(x)+r(x))
         而CRC码:$m(x)x^k + r(x) = g(x)Q(x) + r(x) + r(x) $
         /** 因为r(x)和r(x)是模二加运算,所以相加后为0,消去了r(x) **/
         最终CRC码变成了g(x)*Q(x),到对方当校验的时候,CRC码除以g(x)就不会有余数

    (6)CRC的检错:所有位的都能知道是哪一位出错,也只能知道一位
            eg:设数据位m(x)=1100,生成多项式G(x)为1011,求产生的CRC码
            (a)生成多项式1011,是4位,所以余数位(产生的校验位)为3位,
            (b)数据位左移三位,变成1100000,模二除1011,得到商1110,余数010
            (c)CRC码:1100010
    (7)纠错:
            设CRC码的第7位传输出错,则CRC变成1100001。 此时,除以生成多项式得到余数001。
            设CRC码的第6位传输出错,则CRC变成1100000。 此时,除以生成多项式得到余数010。
            而这个010,恰恰是第7位传输出错后的余数001,后面补一位0后除以1011的

(a)反过来想,CRC的纠错功能,要让每一位传输出错后,除以多项式的余数都不同,所以如果数据为4位,余数的位数要满足4+n+1<2^n,此时n=3(4+n后面还要加1是因为1代表没有出错的情况)。所以生成多项式要有4位
(b)余数;如果001补两个0,的道德余数就是第5位出错的余数,循环的意义在与此:在计算出错位数除以生成多项式产生的余数时,可以先计算一个最低位出错后产生的余数,之后比他高一位的位传输错误产生的余数就可以用循环补0除以多项式的方法计算。所以g(x)不好选,要构成这种循环。
(c)根据这种循环计算出错位产生的余数方法,就行成了一个出错位对应产生余数的表。有了这个表,接收端计算后发现传输的数据有余数时,就能知道是哪一位出错了,也就有了纠错的功能。
(d)发现对应位出错,就把该位置的数据取反。电路实现上,不能在每一位数据加上一个非门,这样硬件成本太高。而是采用,只有一个非门,改变数据的时候,只需把数据循环移位,将出错的位置移到第一位,非门改变第一位数据后,再次循环移位成原来的顺序

(8)生成多项式的产生要满足检错纠错的功能

2.2 定点数的表示

  1. 无符号数
    寄存器的位数表示熟知的范围:8位为0~255

  2. 定点整数与定点小数

  3. 原码,反码,补码,移码
    (1)原码:
        (a)最高位表示符号位,0表示正号,1表示负号,有效值部分用二进制的绝对值表示。
        (b)原码 = 符号 + 绝对值
        (c)定点整数定义:

            ([X]_原)=0,x ((2^n > x geq 0)
            ([X]_原)=2^n - x((0 > x geq -2^n)
            (因为x为负数,减x相当于加上一个x绝对值,而(2^n)相当于最高位的1,所以就是1后面跟x的绝对值)
            eg:x = +1110,([X]_原) = 0,1110

        x= -1110,,([X]_原) = 1,1110

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(d)定点小数定义:
>   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$[X]_原$=0. x  ($1 > x geq 0$)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$[X]_原$=1-x ($0 > x geq -1$) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eg:x=+0.1101  =>  $[X]_原$=0.1101
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = -0.1101  =>  $[X]_原$=1.1101
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【注】:原码中,+0和-0的表示方法不一样。1,0000和0,0000
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(e)原码表示范围:$-(1-2^{-n}) leq x leq 1-2^{-n}$)。 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;源码小数的表示范围:$-(2^{-n})-1 leq x leq (2^{-n}-1)$ 

(2)补码
原文地址:https://www.cnblogs.com/moonlord/p/5937975.html