1
0
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:
Didnelpsun
2021-05-18 23:50:56 +08:00
parent 3b545eb31e
commit 7afda3e86e

View File

@@ -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=15B=-24求A+B和A-B的补码。
+ A=+1111从而原码补码为0000 1111B=-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。
## 算术逻辑单元