mirror of
https://github.com/Didnelpsun/CS408.git
synced 2026-06-17 07:27:12 +08:00
Update 1-data-representation-and-operation.md
This commit is contained in:
@@ -190,11 +190,168 @@ k|2|3|4|5|6|7
|
||||
1. 数据发送、接受方约定一个“除数”。
|
||||
2. K个信息位+R个校验位作为“被除数”,添加校验位后需保证除法的余数为0。
|
||||
3. 收到数据后,进行除法检查余数是否为0。
|
||||
|
||||
+ 得到CRC码的方法:
|
||||
1. 确定K和R以及生成多项式对应的二进制码。其中R位生成多项式的最高次幂数。
|
||||
2. 将信息码左移R位,低位补0。
|
||||
3. 使用模二除法。
|
||||
4. 余数就是校验位,只比多项式少一位。
|
||||
5. 对全部数据进行多项式除,余数为0代表无措。
|
||||
6. 若余数不为0,则出错。
|
||||
7. 若$n$个信息位,$k$个校验位,若生成多项式得当,且$2^k\geqslant n+k+1$,则CRC码可纠正一位错。实际上基本上不怎么用来纠错。
|
||||
|
||||
## 定点数
|
||||
|
||||
指小数点的位置不变,使用常规计数法,如96.94。
|
||||
|
||||
### 定点数表示
|
||||
|
||||
#### 无符号数
|
||||
|
||||
+ 整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。
|
||||
+ $n$位无符号数表示范围为$[0,2^n-1]$。
|
||||
+ 无符号数不涉及小数。
|
||||
|
||||
#### 有符号数
|
||||
|
||||
+ 定点整数:最高一位是符号位,0是正,1是负,小数点位置一般隐含在最后。
|
||||
+ 定点小数:最高一位是符号位,0是正,1是负,小数点位置隐含在符号位后面。
|
||||
+ 数值部分也称为尾数。要保存一个非整数需要保存定点整数与定点小数两个部分。
|
||||
|
||||
#### 原码
|
||||
|
||||
+ 原码:用尾数表示真值的绝对值,符号位“0/1”对应“正/负”。
|
||||
+ 若机器字长为n+1位,则尾数占n位。
|
||||
+ 若使用1B来保存数值,则+19D就是0001 0011,-19D就是1001 0011。
|
||||
+ 有时1001 0011会写为1,0010011,其中的逗号只是为了标注正负号,本身是不存在的。
|
||||
+ 若未指明机器字长,则最开头的多个0可以省略。如1001 0011可以表示为1,10011。
|
||||
+ 同理小数也可以使用1.11表示,这是指-0.11。
|
||||
+ 若机器字长$n+1$位,则原码整数的表示范围是$[-(2^n-1),2^n-1]$。
|
||||
+ 若机器字长$n+1$位,则原码小数的表示范围是$[-(1-2^{-n}),1-2^{-n}]$。
|
||||
+ 原码表示时真值0有+0和-0两种形式。
|
||||
|
||||
#### 反码
|
||||
|
||||
+ 反码:若符号位为0,则反码与原码相同,若符号位为1,则数值位全部取反。
|
||||
+ 可以转换为原码再取反。
|
||||
+ 若机器字长$n+1$位,则反码整数的表示范围是$[-(2^n-1),2^n-1]$。
|
||||
+ 若机器字长$n+1$位,则反码小数的表示范围是$[-(1-2^{-n}),1-2^{-n}]$。
|
||||
+ 反码表示时真值0有+0和-0两种形式。
|
||||
+ 反码只是由原码转换为补码的一个中间态,实际上并没有作用。
|
||||
|
||||
#### 补码
|
||||
|
||||
+ 补码:若符号位为0,则反码与原码相同,若符号位为1,则数值位全部取反再加一,即反码加一。
|
||||
+ 补码表示时真值0只有一种形式0000 0000。
|
||||
+ 多出来的一种形式1000 0000表示$-2^7$和$-1$。
|
||||
+ 若机器字长$n+1$位,则补码整数的表示范围是$[-2^n,2^n-1]$。
|
||||
+ 若机器字长$n+1$位,则补码小数的表示范围是$[-1,1-2^{-n}]$。
|
||||
+ 将负数补码转回原码的方法相同:尾数取反,末位加一。补码的补码就是原码。
|
||||
+ 如果已知一个数值的补码,那么求这个值的负数的补码就是全部位取反,末位加一。
|
||||
+ 如果已知一个负数的补码,那个求这个值的原码就是数值位取反再加一,或是负数补码中,最右边的1以及右边不变,最右边的1的左边取反。
|
||||
|
||||
#### 移码
|
||||
|
||||
+ 补码的基础上将符号位取反。
|
||||
+ 移码只能用于表示整数,而不能表示定点小数。
|
||||
+ 若机器字长$n+1$位,则移码整数的表示范围是$[-2^n,2^n-1]$。
|
||||
+ 若机器字长$n+1$位,则移码小数的表示范围是$[-1,1-2^{-n}]$。
|
||||
+ 移码由于负数的最高位为0,正数的最高位为1,从而能更方便对比大小。
|
||||
|
||||
机器数|无符号数|原码|反码|补码|移码
|
||||
:----:|:------:|:--:|:--:|:--:|:--:
|
||||
0000 0000|0|+0|+0|0|-128
|
||||
0000 0001|1|+1|+1|+1|-127
|
||||
...
|
||||
0111 1101|125|+125|+125|+125|-3
|
||||
0111 1110|126|+126|+126|+126|-2
|
||||
0111 1111|127|+127|+127|+127|-1
|
||||
1000 0000|128|-0|-127|-128|0
|
||||
1000 0001|129|-1|-126|-127|1
|
||||
1000 0010|130|-2|-125|-126|2
|
||||
...
|
||||
1111 1101|253|-125|-2|-3|125
|
||||
1111 1110|254|-126|-1|-2|126
|
||||
1111 1111|255|-127|-0|-1|127
|
||||
|
||||
#### 补码作用
|
||||
|
||||
+ 原码在计算时由于首位表示的是符号,所以需要考虑将加减运算转换的问题,而减法实现起来比较困难,就考虑是否可以将减法通过加法来实现。
|
||||
+ 由于计算机码操作若最高位进一就被舍弃,则天然是进行模运算,所以可以通过数学模运算来实现机器码的运算。
|
||||
+ 带余除法:设$x,m\in Z$,$m>0$则存在唯一决定的整数$q$和$r$,使得$x=q\cdot m+r\,,0\leqslant r<m$。
|
||||
+ 若两个数绝对值之和为模,则互为补数。即模-数的绝对值=数的补数(正数)。从而数加上数的补数就得到了模。
|
||||
+ 补码就是正数不变,负数取模的结果。如-66=- 0100 0010,而(1000 0000 - 0100 0010)mod(1111 1111)=1011 1110,也就是其补码。
|
||||
+ 从而就可以用补数的加法替代原码转换的减法。
|
||||
+ 所以补码可以让减法操作转换为加法操作,减少硬件成本。
|
||||
|
||||
### 定点数运算
|
||||
|
||||
#### 移位运算
|
||||
|
||||
+ 算术移位:通过改变各介数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法。
|
||||
+ 原码的算数移位——符号位保持不变,仅对数值位进行移位:
|
||||
+ 若右移高位补0,低位舍弃,右移代表除2,若移出的是0则刚好整除,若移出的是1则会整除余1丢失精度。
|
||||
+ 若左移低位补0,低位舍弃,左移代表乘2,若移出的是0则刚好乘2,若移出的是1,则会严重误差。
|
||||
+ 反码的算术移位——正数的反码与原码相同,所以正数的处理跟原码一样。而对于负数而言,反码的1等于原码的0,反码的0等于原码的1:
|
||||
+ 若右移高位补1,低位舍弃。
|
||||
+ 若左移高位补1,低位舍弃。
|
||||
+ 补码的算术移位——正数的补码与原码相同,所以正数的处理跟原码一样。由于负数补码=反码末位加一,导致反码最右边几个连续的1都因进位而变为0,直到进位碰到第一个0为止。所以得到规律:
|
||||
+ 负数补码中,最右边的1及其右边同原码一样。最右边的1的左边同反码一样。
|
||||
+ 右移同反码,高位补1,低位舍弃。
|
||||
+ 左移同原码,低位补0,高位舍弃。
|
||||
+ 逻辑移位,可以视为对无符号数的算术移位:
|
||||
+ 逻辑右移:高位补0,低位舍弃。
|
||||
+ 逻辑左移:低位补0,高位舍弃。
|
||||
+ 循环移位,将移出的一位放到另一端的端点,类似队列:
|
||||
+ 循环右移:将最低位的一位移出放到最高位,其余右移一位。
|
||||
+ 循环左移:将最高位的一位移出放到最低位,其余左移一位。
|
||||
+ 进位位CF:保存计算是否进位。1代表产生进位,0代表未产生进位。
|
||||
+ 带进位位的循环左移:需要加上进位位数值的循环左移。
|
||||
+ 带进位位的循环右移:需要加上进位位数值的循环右移。
|
||||
|
||||
#### 加减运算
|
||||
|
||||
+ 原码的加减,由加法器和减法器两个硬件来实现,因为最高位为符号位,所以不能直接进行加减:
|
||||
+ 原码的加法:
|
||||
+ 正数+正数:绝对值做加法,结果为正数。
|
||||
+ 负数+负数:绝对值做加法,结果为负数。
|
||||
+ 正数+负数:绝对值大的减绝对值小的,符号同绝对值大的数。
|
||||
+ 负数+正数:绝对值大的减绝对殖小的,符号同绝对值大的数。
|
||||
+ 原码的减法,减数符号取反,转变为加法:
|
||||
+ 正-负→正+正。
|
||||
+ 负-正→负+负。
|
||||
+ 正-正→正+负。
|
||||
+ 负+正→负-负。
|
||||
+ 补码的加减,由于减法器的硬件实现比较困难,所以原码的减法操作可以由补码来更简单实现,不用考虑符号位的异常,直接全部参与运算:
|
||||
+ 如设机器字长为8位含一位符号位,A=15,B=-24,求A+B和A-B的补码。
|
||||
+ A=+1111,从而原码补码为0000 1111,B=-11000,所以原码为1001 1000,反码为1110 0111,补码为1110 1000。
|
||||
+ 所以A+B的补码等于A的补码加B的补码,为0000 1111+1110 1000=1111 0111,原码就是1000 1001,即-9,这与预期的一样。
|
||||
+ 同理负数值的补码就是补码全部取反加1,所以A-B=0000 1111+0001 1000=0010 0111,即+39。
|
||||
+ 溢出判断,由于使用补码进行加减操作都会变成加法,所以只用考虑加法溢出的处理。
|
||||
+ 小于最小值就是下溢。只有负数+负数才会下溢得到正数。如-24-124=1110 1000+1000 0100=0110 1100=108。
|
||||
+ 大于最大值就是上溢。只有正数+正数才会上溢得到负数。如15+124=0000 1111+0111 1100=1000 1011=-117。
|
||||
+ 方法一,采用一位符号位(模二补码),根据符号位判断:
|
||||
+ 设A的符号为$A_s$,B的符号为$B_s$,运算结果的符号为$S_s$。
|
||||
+ 则溢出逻辑表达式为$V=A_sB_s\overline{S_s}+ \overline{A_s}\overline{B_s}S_s$(即$V=A_s\&\&B_s\&\&!(S_s)\mid\mid!(A_s)\&\&!(B_s)\&\&S_s$)。
|
||||
+ 若$V=0$,表示无溢出,若$V=1$,表示有溢出。
|
||||
+ 如-24-124=108产生了溢出,$A_s=1$、$B_s=1$、$S_s=0$,$V=A_sB_s\overline{S_s}+ \overline{A_s}\overline{B_s}S_s=1\,1\,1+0\,0\,0=1+0=1$,所以产生了溢出。
|
||||
+ 方法二,采用一位符号位(模二补码),根据数据位进位1情况判断:
|
||||
+ 符号位的进位$C_s=0$,最高数值位的进位$C_1=1$时产生了上溢。
|
||||
+ 符号位的进位$C_s=1$,最高数值位的进位$C_1=0$时产生了下溢。
|
||||
+ 如-24-124=1110 1000+1000 0100=0110 1100中符号位都为1,所以符号位进1,$C_s=1$,而最高数值位为1+0=1,没有进位,所以$C_1=0$,所以就产生了下溢。
|
||||
+ 方法三,采用双符号位(模四补码),正数符号为00,负数符号为11。
|
||||
+ 若两个符号位不同,则表示溢出,第一个符号位表示应该得到的符号位,第二个符号位代表实际得到的符号位。
|
||||
+ 如-24-124=11,110 1000+11,000 0100=10,110 1100=108。下溢。
|
||||
+ 如15+124=00,000 1111+00,111 1100=01,000 1011=-117。上溢。
|
||||
+ 实际存储时只存储一个符号位,运算时会复制一个符号位。
|
||||
+ 符号扩展
|
||||
|
||||
#### 乘法运算
|
||||
|
||||
#### 除法运算
|
||||
|
||||
## 浮点数
|
||||
|
||||
指小数点的位置不固定,使用科学计数法,如9.694E2。
|
||||
|
||||
## 算术逻辑单元
|
||||
|
||||
|
||||
Reference in New Issue
Block a user