进制转换
2进制转8进制
从小数点开始向左向右,3个一组换算成8进制,缺位补0。
如例3.4
8进制转2进制
将一位8进制数换算成3位2进制数。
如例3.6
2进制转16进制
从小数点开始向左向右,4个一组换算成16进制,缺位补0。
16进制转2进制
将一位16进制数换算成4位2进制数。
8进制转16进制(拓展)
从小数点开始向左向右,2个一组换算成16进制,缺位补0。可以先变成2进制,再变成16进制。
如表3.1
2进制转10进制
每位2进制数乘以它的权重,再求和。8421
如例3.1
10进制转2进制
整数部分
除2取余至商为0,先求出来的余数靠近小数点(低位)。
如例3.7
小数部分
小数部分 乘2取整至小数部分为0或满足精度要求,先求出来的整数靠近小数点(高位)。
如例3.8
机器数的表示
- 机器数有三种表示方式:原码、反码和补码。
我们先假设机器数为小数,符号为放在最左边,小数点置于符号位和数值之间。
真值
- 即
±绝对值
,用$X$表示,正号有时可省略。
原码
- 最高位为符号位,0表示正数,1表示负数,绝对值跟随其后。
- 小数点的位置默认在符号位之后,书写时可以将小数点保留或省略。
0的原码有两种表示形式:
- $[+0]_原=00000=0.0000$
- $[-0]_原=10000=1.0000$
补码
- 正数的补码与其原码一样
- 补码零的表示形式唯一:$[+0]_补=[-0]_补=00000=0.0000$
负数原码补码互求
- 符号位不变
- 数据位按位取反
- 末位+1
加法
若加法运算不超过机器范围时:
加法结果仍为补码
$[X+Y]_补=[X]_补+[Y]_补$
$[X-Y]_补=[X]_补+[-Y]_补$
符号位也参与运算
由$[Y]_补$求$[-Y]_补$
- $[Y]_补$所有位取反
- 末位+1
证明$[X+Y]_补=[X]_补+[Y]_补$
补码定义:
$X>0,Y>0$
可知$X+Y>0$,所以$[X+Y]_补=X+Y=X_补+Y_补$。
$X>0,Y<0$
$[X]_补=X$
$[Y]_补=2+Y$
$[X+Y]_补=X+Y=X_补+Y_补$
==待续==
反码
- 正数的反码与其原码一样
负数原码反码互求
- 符号位不变
- 数据位按位取反
加减法运算的溢出判断
有进位$\neq$溢出
只有两个同号数相加或两个异号数相减,才有可能溢出。
定点运算器中,无论双符号位还是单符号位,必须有溢出判断电路,它一般由异或门来实现。
以下为三种方法(双符号位法较重要):
当符号相同的两数相加时,结果的符号与加数或被加数不相同,则为溢出。
当任意符号两数相加时,如果$C\neq C_f$,则为溢出,即溢出条件为$C\bigoplus C_f$,其中$C$为数值最高位的进位,$C_f$为符号位的进位。
采用双符号位$f_{S2}f_{S1}$,正数双符号位为00,负数双符号位为11。
两个符号位都参与运算,如果结果$f_{S1}\neq f_{S2}$,则为溢出,即溢出条件为$f_{S1}\bigoplus f_{S2}$。
若采用双符号位,运算结果的符号位为高符号位$f_{S2}$。
浮点数
浮点数指小数点位置可浮动的数据,通常以下式表示:
$N$
浮点数
$M$
尾数,mantissa
$E$
阶码,exponent(幂)
$R$
阶的基数,radix(进制、基数),$R$为一常数,在一台计算机中,所有数据的$R$都是相同的,不需要在每个数据中表示出来。
浮点数的机内表示一般采用以下形式
格式 | $M_S$ | $E$ | $M$ |
---|---|---|---|
位数 | 1 | $n+1$ | $m$ |
说明 | 尾数的符号位 | 阶码,其中最高位为符号位,表示正阶或负阶 | 尾数 |
尾数规格化
定义
为了保证(极高)数据精度,尾数通常用规格化形式表示:当$R=2$,且尾数值不为0时,尾数绝对值应$\geq(0.5)_{10}$。
方法
对非规格化浮点数,通过将尾数左移或右移,并修改阶码值使之满足规格化要求。
尾数左移几位,阶码也减少几;尾数右移几,阶码就增加几。
机器零
当一个浮点数的尾数为0或阶码的值比在机器中表示的最小值还小时,计算机都把该浮点数看成零值,称为机器零。
在多数通用机中,浮点数的尾数用原码或补码表示,阶码用补码或移码表示。
移码
- $[X]_补$符号位取反后即为$[X]_移$。
- 计算机中,移码(阶码)只进行加减法运算,且需要对得到的结果进行修正,即对结果的符号位求反。
- 数据零有惟一的编码,$[+0]_移=[-0]_移=1000\dots0$。当数据小于计算机能表示的最小值时,称为机器零,将阶码(移码)置为$0000\dots0$,且不管尾数值是多少,都按浮点数下溢处理。
数值范围和精度
定义
数值范围
机器所能表示的一个数的最大值和最小值之间的范围
数据精度
一个数的有效位数
常用浮点数(IEEE754国际标准)
基数$R$为2,阶码采用移码(也称增码),尾数采用原码。因为规格化原码尾数的最高位恒为1,所以不再尾数中表示出来,计算时在尾数前边自动添上1。
| 浮点数类型 | 阶码 | 尾数 |
| :———————————: | :———: | :—————————-: |
| 单精度浮点数(32位) | 8位 | 24位(内含1位符号位) |
| 双精度浮点数(64位) | 11位 | 53位(内含1位符号位) |
浮点数的加减法运算
有5步操作,如下:
对阶
阶码较小的浮点数尾数右移$\Delta E$位,其阶码值加上$\Delta E$。
若尾数是原码表示的,是无符号移位;
若尾数是补码表示的,是带符号移位。(上边也讲了补码的符号位参与运算嘛)
尾数的加减运算
两尾数进行加减运算,得到两尾数之和/差。
规格化操作
左规
如果结果两符号位值相同,则尾数加减结果未溢出。
但若最高数值位与符号位相同,此时尾数连续左移,直至最高数值位与符号位的值不同为止,同时从阶码中减去移位的位数。
右规
如果结果两符号位值不同,则尾数加减结果溢出。此时将尾数结果右移1位,阶码+1。
舍入
作用:处理尾数右移(右规或对阶)时丢失的低位。
当丢失的最高位为1时,在尾数末位+1,如果加1使尾数溢出,就再进行一次右规。
检查阶码是否溢出
阶码溢出表示浮点数溢出。
若阶码下溢,则置运算结果为机器零(通常尾数和阶码全部置0);若上溢,则置溢出标志。
定点原码一位乘法
定点补码一位乘法
定点原码一位除法
奇偶校验码
原理
码距:根据任意两个合法码之间至少有几个二进制位确定,若仅有1位不同,则称其码距为1。
使码距由1增加到2。
方法
为1个字节(8位)补充1位到高位,称为校验位;低8位为数据位。
添加校验位,使1的个数为奇数时,这种方法称为奇校验;使1的个数为偶数时,称为偶校验。
奇校验
若数据位中有奇数个1,校验位为0;若有偶数个1,校验位为1。
偶校验
若数据位中有奇数个1,校验位为1;若有偶数个1,校验位为0。
功能
- 发现1位或奇数个位错。
- 不能确定哪一位错,也不能发现偶数个位错。
记住第一句话即可,它的功能只有第一句话,所以第二句可有可无。
海明校验码
原理
海明校验码基于偶校验。
在数据中加入$r$个校验位,并把数据的每一个二进制位(共$k$个数据位)分配在几个奇偶校验组中,即一个数据位由多个校验位校验。
- $2^r$:$r$个校验码可以表示$2^r$个信息。
- $-1$:用1个信息表示没有错误。
- $-r$:错误也可能发生在$r$个校验位。
方法
$k$为数据位个数,$r$为校验位个数,$m=r+k$,即海明码的位数。
海明码(Hamming Code)为$H_mH_{m-1}…H_2H_1$。
- $H_i$为第$i$个海明码位。
- $P_i$为第$i$个校验位(Parity Bit)。
- $D_i$为第$i$个数据位(Data Bit)。
确定校验位的位置
每位海明码由多个校验位校验,规律如下式:
由上式可知,第$i$个校验位$P_i$的海明码位号为$2^{i-1}$或最高位,海明码的其他位为数据位。
确定校验位的表达式$P_i$
根据偶校验原理可得:
确定校验和表达式$S_i$
若某校验和的值为0,说明该组没有错。若所有校验和值为0,则海明码没有出错。
纠错
根据所有校验和的值及其表达式,是可以判断出哪一位出了错的。
功能
发现一位错并纠正。
若想发现两位错,则应再增加一个校验位$S’$,即书上例子里的$S_5$,用来判断是奇数还是偶数个出错。
若$S’$为0,则说明偶数个出错;若为1,则奇数个出错。
偶数个出错时,若$S_i$都为0,即$S$的值都为0时,则没有出错。
循环冗余校验码
模2运算
模2加减
即异或。
模2乘
按模2加求部分积之和。
模2除
按模2减求部分余数。
每求一位商应使部分余数减少一位(即不要最高的一位),并在低位补0。
当部分余数首位为1时,商取1,减数取除数;
当部分余数首位为0时,商取0,减数取0。
编码方法
数据说明
$(n,k)码$,其中高$k$位是数据位;后$r$位是校验位(与奇偶校验不同);$n=k+r$为CRC码的长度。
令$M$为数据位;$G$为生成多项式(Generator Polynomial),它有$r+1$位。
编码
$M$左移$r$位得$M’$,$M’$模2除以$G$。
设所得余数(Remainder)为$R$,$r$位;商(Quotient)为$Q$。
$M’$加上$R$即得CRC码。
纠错方法
判断错误
CRC码模2除以$G$是可以除尽的。
若余数为0,则无误;
若余数不为0,则某一位出错,且不同位出错,余数不同。
余数与出错位对应关系不变,只与码制和生成多项式有关。
纠错
得到一个不为0的余数后:
在其右侧补0,继续除下去(余数的变化是规律的),每除一次的同时将CRC码循环左移。
循环该操作至余数为101($G$为1011时),此时出错位在最高位。
作者:@臭咸鱼
转载请注明出处:https://chouxianyu.github.io
欢迎讨论和交流!