【计组】数据的表示与运算
一、数据的表示方法和转换
1、真值
二进制数和十进制数一样有正负之分,书写时加上"+"或"-"来表示的,叫做真值。
例:十进制的+3和-6,二进制的+011和-110都是真值。
2、机器数
机器数采用二进制的0表示正,1表示负。符号数值化的带符号二进制数,称为机器数。
例:真值的-011,用机器数表示为0011,而-110就可以表示为1110。
3、BCD码
BCD(Binary-Coded Decimal)码,也叫二-十进制码,主要就是用4位二进制来表示1位的从0~9的进制数。BCD码主要分为有权码(8421码、5421码、2421码)和无权码(余三码、余三循环码)。
3.1、8421码
用指定的4位二进制数来表示1位的从0~9的十进制数。对照表格即可:
十进制 | 8421 码 |
---|---|
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
换算算法:8421码主要有两种换算算法,从二进制到八进制(B to O),从八进制到二进制(O to B)。
B to O:例:0111---> (8 * 0)+(4 * 1)+(2 * 1)+(1*1) = 7
O to B:例:60的二进制是11110---> 111 100 =7 4
3.2、余三码
余三码是由8421码加上0011后形成的一种无权码。
例:(4567)对应的 余3码为 0111 1000 1001 1010
推导过程 即 4 对应 0100 + 0011(十进制的3)=0111
5 对应0101 + 0011 =1000
6 对应0110 + 0011 =1001
7 对应0111 + 0011 =1010
当两个余三码相加不产生进位时,应从结果中减去0011;产生进位时,应将进位信号送入高位,本位加0011。
4、格雷码
格雷码,又叫循环二进制码或反射二进制码,是指任何两个相邻编码只有1个二进制位不同,而其余3个二进制位相同。余三循环码就是余三码通过格雷码的异或运算,所得到的一系列变权码。
二进制数与格雷码间的转换关系如下表:
十进制码 | 二进制码 | 格雷码 | 十进制码 | 二进制码 | 格雷码 |
---|---|---|---|---|---|
0 | 0000 | 0000 | 8 | 1000 | 1100 |
1 | 0001 | 0001 | 9 | 1001 | 1101 |
2 | 0010 | 0011 | 10 | 1010 | 1111 |
3 | 0011 | 0010 | 11 | 1011 | 1110 |
4 | 0100 | 0110 | 12 | 1100 | 1010 |
5 | 0101 | 0111 | 13 | 1101 | 1011 |
6 | 0110 | 0101 | 14 | 1110 | 1001 |
7 | 0111 | 0100 | 15 | 1111 | 1000 |
二进制码转换为格雷码:
法则是保留二进制码的最高位作为格雷码的最高位,格雷码的其余位为二进制码对应位与其上一位相异或。
格雷码转换为二进制码:
法则是保留格雷码的最高位作为二进制码的最高位,二进制码的其余位为格雷码对应位与二进制码上一位相异或。
二、带符号的二进制数据的表示方法及加减运算
1、原码
原码是指最高位为符号位0/1 + 数值的绝对值形式。
例:
x = +0.1101,则[x]原 = 0.1101;x = +1101,则[x]原=01101
x = -0.1111,则[x]原 = 1.1111;x = -1111,则[x]原 = 11111
特点:
- 值0+,-0的原码分别为00000、10000,形式不唯一;
- 正数的原码码值随着真挚的增长而增长,负数的原码码值随着真值的增长而减少;
- n+1 位原码表示定点整数范围-(2n-1) --- 2n-1,n+1 位的原码表示定点小数范围-(1-2-n) --- 1-2-n。
运算:符号位不参与计算,绝对值相加减,数值的大小决定原酸结果符号。
2、反码
X是正数,[X]反=[X]正;X是负数,则符号不变,数值取反。另一定义法,即[x]反 = (2-2-n)符号位 + X(MOD(模)2-2-n)。
例:
x=+0.1101,则[x]反=0.1101;x=+1101,则[x]反=01101
x= -0.1111,则[x]反=1.0000;x= -1111,则[x]反=10000
特点:
- 数值零的反码表示不唯一
- 正数反码码值随着真值增大而增大,负数反码码值随着真值的增大而增大
- n+1 位反码所表示的定点整数范围 -(2n-1) --- 2n-1,n+1位反码所表示定点所表示定点小数范围-(1-2-n) --- 1-2-n。
运算:在机器数范围内,反码运算满足[X+Y]反=[X]反+[Y]反,[X - Y]反 = [X]反 + [-Y]反。反码运算在最高位由有进位时,要在最低为+1,此时要多进行一次加法运算,因此很少采用。
3、补码
X是正数,[X]补=[X]反=[X]正;X是负数,则符号不变,数值取反后+1。另一定义法,即[X]补 = 2*符号位 + X(MOD(模)2)。
例如:
x=+0.0101,则[x]补=0.0101;
x= -0.0101,则[x]原=1.0101--->[x]反=1.1010--->[x]补=1.1011;
x= -0.0000,则[x]原=1.0000--->[x]反=1.1111--->[x]补=0.0000;
特点:
- 数值零的补码表示唯一;
- 正数补码码值随着真值增大而增大,负数补码码值随着真值增大而增大;
- n+1位补码所表示定点整数范围 -2n --- 2n-1,n+1位补码所表示定点小数范围 -1 --- 1-2-n。
运算:结果不超过机器所能表示范围时,[X+Y]补 = [X]补 + [Y]补,[X-Y]补=[X+(-Y)]补=[X]补+[-Y]补。
例1:设x=0.1010,y=0.0101,求 [x]补+[y]补 。
先将真值x和y转换成由补码数据表示:
x[补]=0.1010,y[补]=0.0101
利用补码加法公式可得:
[x]补 0.1010
+++[y]补 0.0101++
[x+y]补 0.1111
所以:x[补]+[y]补=0.1111
例2:设x=0.1001,y=0.0110,求 [x]补-[y]补 。[x]补=0.1001,[y]补=0.0110,[-y]补=1.1010
[x]补 0.1001
+++[-y]补 1.1010++
[x-y]补 10.0011
符号位进位的1值为模数,应该舍去,所以:[x]补-[y]补=0.0011
结论:
- 负数的补数=模+负数
- 互为补数的绝对值相加=模
- 在补数中,减法运算即加法运算
加减法运算的溢出处理:
当运算结果超出机器数所能表示的范围称为溢出。可能溢出的情况分为同号数相加和异号数相减。
判断溢出的方法
法一:当符号相同两数相加,结果符号和加数(或被加数)不相同,则溢出。fa,fb 表示两操作数(A,B)的符号位,fs 为结果的符号位。
法二:任意符号相加,如果C = Cf,则结果正确,否则溢出;C 为数值最高位的进位,Cf 为符号位的进位。
法三:采用双符号相加,如果fs1 = fs2,则结果正确,否则溢出;运算结果的符号位为 fs2;
多符号位的补码,叫做变形补码;如果采用双符号位,当数为小数时,模m=4;当数为整数时,模m=2的n+2次方。
4、移码
[X]补的符号位取反,即得[X]移。
特点:
- 最高位是符号位,1表示正,0表示负;
- 数据0有唯一的编码;
- 移码码值随着真值增大而增大
- n+1位移码所表示定点整数范围 -2n --- 2n-1,n+1 位移码所表示定点小数范围 -1 --- 1-2-n;
- 计算机中,移码常用于表示阶码,故只执行加、减运算;
- 计算机中,移码运算公式需要对结果进行修正。
浮点数的阶码求和公式
[X]移+[Y]补 = [X+Y]移 mod2的n+1次方
[X]移+[-Y]补 = [X-Y]移
判溢方法:
- 双符号位参加运算,最高符号位恒置0
- 当结果最高符号位=1则溢出 低位符号=0,则上溢;地位符号=1,则下溢;
- 当结果最高符号位=0则未溢出 低位符号=0,负数;地位符号=1,正数;
说明:如果阶码运算的结果溢出,上述条件不成立。此时,使用双符号位的阶码加法器,并规定移码的第二个符号位,即最高符号位恒用0参加加减运算,则溢出条件是结果的最高符号位为1。此时低位符号为0时,表明结果上溢;为1时,表明结果下溢。当最高符号位为0时,表明没有溢出,低位符号位为1,表明结果为正;为0时表明结果为负。
三、定点数和浮点数
1、定点数
小数点固定在某个位置上的数据,小数点前、后的数字,分别用二进制表示,这种表示方式叫做「定点」表示法,用这种方法表示的数字叫做「定点数」。
用定点数表示一个小数的方法:
- 在有限的 bit 宽度下,先约定小数点的位置;
- 整数部分和小数部分,分别转换为二进制表示;
- 两部分二进制组合起来,即是结果。
约定前5位表示整数部分,后3位表示小数部分。用定点数表示如下,例:
1.5(D) = 00001 100(B)
25.125(D) = 11001 001(B)
2、浮点数
1、符号位(S):安排在最高位,0表示正数,1表示负数
2、阶码(E):8位,跟在符号位之后,指数e加上一个固定的偏移值127(01111111),即E=e+127
3、尾数(M):23位,规格化后,跟在阶码之后,不足23位的在右边(低位)补0
规格化:为了提高数据的表示精度,当尾数的值不为0时,尾数域的最高有效位应为1,这称为浮点数的规格化表示。
根据 IEEE754 国际标准,常用的浮点数有两种格式:
Nmax = Mmax * 2的Emax;Nmin = Mmin * 2的Emax。
单精度(32位)=1位符号(S)+8位阶码(E)+23位尾数(M),取值范围:-2的127次方~(1-2的-23次方) * 2的127次方。
双精度(64位)=1位符号(S)+11位阶码(E)+52位尾数(M),取值范围:2的1023次方~(1-2的-52次方) * 2的1023次方。
为了保证数据精度,尾数通常用规格化形式表示:当R=2,且尾数值不为0时,其绝对值应大于或等于(0.5)10。
表示形式:N = M * RE
计算机中存储形式:MS+ES+E(n位)+M(m位)
阶码E,一般为整数,用补码或者移码表示;尾数M,一般为规格化的定点小数,用补码表示。
将十进制转换为浮点数:
例:将十进制数20.59375转换成IEEE754单精度浮点数的十六进制机器码
① 首先我们要分别将整数和小数部分转换成二进制数:
20的二进制为10100,0.59375的二进制为0.10011,所以20.59375的二进制表示为10100.10011
② 移动小数点,使尾数变成1.M的形式(规格化):
10100.10011=1.010010011*2^4
③ 分析得:
S=0,E=e+127=4+127=131=10000011,M=010010011
所以32位浮点数的二进制存储格式为:
0 1000 0011 010 0100 1100 0000 0000 0000 数符(S) 阶码(E) 尾数(M) ④ 最终的机器码为:0100 0001 1010 0100 1100 0000 0000 0000
对应的十六进制为: 4 1 A 4 C 0 0 0
将浮点数转换为十进制数:
例:求IEEE754单精度十六进制浮点数(C1360000)对应的十进制
① 将十六进制数展开成二进制数为:1100 0001 0011 0110 0000 0000 0000 0000
② 从浮点数中分离出S、E、M:
S=1 符号位为:负
E=100 0001 0
M=011 011
③ 计算得:e=E-127=00000011=3(十进制)
实际尾数为:1.M=1.011011
移动小数点,实际尾数为:1011.01
④ 将其转换为十进制数:1011是11,0.011是0.375,所以十进制数为 -11.375。
3、浮点数的运算方法
浮点数加减法运算:
- 对阶操作:求出∆E,再对小的进行移位;
- 尾数的加减运算;
- 规格化操作:规则简化是符号位和数值最高位不同,即00.1xxxx或11.0xxxx;
- 舍入:查出表示范围的高位为1舍入;
- 见检查阶码是否溢出。
浮点数乘除法运算:
- 浮点数阶码运算(移码):
- [X+Y]移 = [X]移 + [Y]补
- [X-Y]移 = [X]移 + [-Y]补
- 按照一位乘或加减交替除运算 先确定符号,在列式子计算。
最后
对各位小伙伴有帮助的话,希望可以点赞❤️+收藏⭐,谢谢各位大佬~~🙌🙌🙌