目录
2.1 无符号数和有符号数
2.1.1 无符号数
没有符号的数,其实就是非负数。在计算机中用字节码表示,目前最常用的是八位和十六位的。
2.1.2 有符号数
将正负符号数字化,0代表 + ,1代表 - ,并把代表符号的数字放在有效数字前,就组成了有符号数。
1. 机器数和真值
我们接下来要用到的真值都指的是带符号的二进制数。
机器数是相对于真值而言的,下面要讲的原码、补码、反码和移码都属于机器数。
2. 原码表示法
原码,顾名思义,是机器数最原本的表示方法,原码包括两个部分,符号位和数值位,符号位用0和1代表这个数的正负,数值位就是真值的绝对值。
为了区别用原码表示的整数和小数,整数的符号位和数值位用逗号隔开,小数的则用小数点隔开。
原码的优点:表示简单,易于和真值转换。
原码的定义 -- 整数
原码的定义 -- 小数
原码可以表示的小数范围在-1和1之间,其他带小数的数可以用整数+小数这样的组合来表示。
例题
注意,在由原码求真值的题目中,若结果为正,那也得加一个 + 号!
3. 补码表示法
补的概念
取模为12的时候,+2等价于-10,-4等价于+8,+3等价于+15等价于+27。
在上面的例子里,-10的补数为+2,-4的补数为+8。并且正数的补数是其本身。
由此可以知道,只要确定了模,就可以为任何一个负数找到与其对应的正数,也就是补数,这样就方便进行运算,在对含有负数的式子进行加法运算时,可以先将负数取补数,最后取模即可。
补的结论
补码的定义 -- 整数
补码的定义 -- 小数
用补码表示负的小数时,因为符号位要为1,所以应该模2,也就是用2减去真值,这样得到的结果里,符号位一定为1,数值位即为真值的补数。
要注意,2也得用二进制来表示!
变形补码 -- 双符号位补码
提到变形补码就要想到双符号位!
求补码的快捷方式
对正数来说,补码就是符号位加上真值本身,简单易求;
对负数来说,求补码则有快捷方式:
总而言之,就是符号位不变,数值位取反,末尾加一。
若已知【X】补,则【-X】补为前者包含符号位的所有位取反再加一。
如果要由补码求原码,就在补码的基础上再求一次补码,就是原码。
4. 反码表示法
反码通常是基于上面原码与补码转换的快捷方式,所需要的中间过渡。
由于正数不需要快捷方式,所以反码还是和原码补码一样,只有符号位和真值不同。
只有负数需要将全体数值位转换为相反的数。
反码的定义 -- 整数
反码的定义 -- 小数
例题
5. 移码表示法
用原码和补码时很难一眼比出两个数的大小,这时候就需要使用移码了。
移码的定义
移码的特点
同一个真值的移码和补码只差一个符号位。
作业题知识点补充
1. 分数转换为二进制数
以 29/128 为例:
第一步
把分子和分母都转换为二进制,要表示为2的多少次。
那么分子表示为:2^4+2^3+2^2+2^0
那么分母呢:2^7
继续将他们写成分数形式:(2^4+2^3+2^2+2^0)/2^7。
接下来计算就好了,结果为:2^-3+2^-4+2^-5+2^-7。
第二步
讲一个小知识点:对于二进制数左移是放大2倍,右移是缩小2倍。
那么对于二进制1,我们右移得到0.1,缩小2倍。所以0.1代表1/2,即2-1。同理,0.01就是1/4,即2-2,以此类推。
有了这个基础,再看看上面的式子,不就是0.001+0.0001+0.000 01+0.000 0001。
用二进制加法计算出最后结果,即0.001 1101。
2. 无原码的特殊情况
补码为1.0000的真值为-1,但是没有原码,因为小数原码的范围如下:
可知,小数1和-1都没有原码。
补码为1,0000的真值为-16,但也没有原码,因为整数原码的范围如下:
当数值位有四位时,原码的取值只能小于+16。
3. 十六进制转换为二进制
每个十六进制数都代表四位二进制数,所以直接按位置转换即可。
0 ~ 9 都可以当成十进制数化为二进制数,只是不足的要补足至四位,而剩下的则如下表所示:
十六进制 | 十进制 | 二进制 |
A | 10 | 1010 |
B | 11 | 1011 |
C | 12 | 1100 |
D | 13 | 1101 |
E | 14 | 1110 |
F | 15 | 1111 |
2.2 数的定点表示和浮点表示
2.1.1 定点表示
2.1.2 浮点表示
规格化数:浮点数的尾数以1开头,例如0.110101。
1. 浮点数的表示形式
2. 浮点数的表示范围
3. 浮点数的规范化
2.2.3 定点数和浮点数的比较
- 当浮点机与定点机中的数其位数相同时,浮点数的表示范围比定点数大得多。(浮点机和定点记中的数都表示为机器数)
- 当浮点数为规格化数时,其精度远高于定点数。
- 浮点数运算分阶码和尾数部分,而且运算结果要求规格化。
- 在溢出的判断方法上,浮点数是对规格化的阶码进行判断,而定点数是对数值本身进行判断。
2.2.4 举例
机器零
- 当浮点数尾数为0时,不论其阶码是多少,按机器零处理;
- 当浮点数阶码等于或小于它能表示的最小数时,不论尾数是多少,按机器零处理
2.2.5 IEEE 754 标准
注意这里的格式和上面的浮点数表示法不同,这里的第一个符是数符,也就是表示这个数字正负发符号,而非阶符,阶符包括在阶码里面!
S:数符号,表示浮点数的正负,0为正,1为负;
阶码(含阶符):实际上是偏移阶码,求得阶码需要用原来的阶数加上不同长度实数对应的偏移量
偏移量:短实数(32位)127,长实数(64)1023
尾数:要先化为“1.xx……xx”的形式,再把最高位的“1”省略,只列出小数点后面的数,不足23位的要用0补齐
下面是由十进制数转换为32位浮点规格化数,要注意的是,先把十进制数转换为二进制数,在这种题目中,要求转换的必然是小数;
接着,将得到的二进制小数规格化,也就是转化为1.00x2^n这样;
如此依据这个小数整体的正负确定第一个数符是0还是1;
然后根据阶码n,用偏移量7FH(也就是0111 1111)+ n,得到阶符,注意这里的n可能是负数!如果为负就变成减去n的绝对值;
最后填入1.00xxx的尾数,直到填满32位为止,注意这里的第一个1要省略掉!
2.3 定点运算
2.3.1 移位运算
1. 移位的意义
定点移位,就是小数点的绝对位置不动,其余的数字全部向左或向右移动;
左移时,绝对值增大;右移时,绝对值减小。
在计算机中整移位运算很有用,让移位和加减配合就可以实现乘除运算。
算术移位:有符号数的移位,数值位在移位,符号位不变。
逻辑移位:无符号数的移位。
2. 算术移位规则
机器数移位后的空位添补规则
要注意,在算术移位中,移位前后符号位不变。
而逻辑移位中,左移时低位添0,高位丢弃;右移时高位添0,低位丢弃。
2.3.2 加减法运算
1. 补码加减运算公式
2. 溢出判断
一位符号位补码判断溢出:
若相加的两个数的符号位相同,和的符号位不同(无论是否有进位),即为溢出。
若相加的两个数符号位不同,则不会溢出。
计算结果若溢出,需要声明!
两位符号位补码判断溢出:
结果的双符号位相同 → 无溢出
结果的双符号位不同 → 溢出
最高符号位代表其真正的符号
2.3.3 乘法运算
1. 笔算乘法
2. 笔算乘法改进
3. 原码乘法
2.3.4 除法运算
1. 笔算除法
2. 原码除法
约定:
- 小数定点除法 x* < y*
- 整数定点除法 x* > y*
- 被除数不等于0
- 除数不能为0
2.4 浮点四则运算
2.4.1 浮点加减运算
1. 对阶
先求两个数的阶差,再让小阶向大阶看齐。
求阶差就是把两个机器数补码的阶数相减,若a-b的阶差为正数x,那么就需要把b的阶数改为a的阶数,并将b的尾数右移 |x| 位。
技巧:若x为负数,由 [x]补 求 [-x]补 时,需要连符号位一起取反,然后末位加1。
2. 尾数求和
对阶之后,将两个尾数按照定加减运算规则运算,其实就是补码的运算,注意数符也要参与。
3. 规格化
当尾数S的最高位数值与符号不同时,即为规格化形式,否则就需要规格化。
当尾数出现 00.0xxx...x 或11.1xxx...x 时,需要进行左规。每次左规时符号位不变,尾数数值左移一位,阶码减1,直到符合规格化形式为止。
当尾数出现 01.xxx...x 或 10.xxx.x 时,表示尾数溢出,需要进行右规。每次右规时,视最高位(左边符号位第1位)为真正的符号位,该位不变,其余位(含左边第2位)右移一位,阶码加一。注意负数补码右移要添1。
4. 舍入
常用的方法为“0舍1入”法:
在规格化中,如果需要右规,就有可能将1丢弃掉,这样降低了计算的准确度,所以我们规定,如果右移舍弃的是0,那就不用管;如果右移舍弃的是1,那就需要将舍弃后的尾数加1。
5. 溢出判断
2.4.2 浮点乘除运算
2.5 算术逻辑单元
2.6 字符的表示
2.6.1 ASCII码
2.6.2 Unicode编码
2.6.3 汉字编码
2.7 指令信息的表示
程序员用各种语言编写的程序必须翻译成指令后,才能在计算机上运行;
计算机的指令有微指令、机器指令和宏指令之分;
一台计算机能执行的机器指令全体称为该计算机的指令系统。
2.7.1 指令格式
指令的意思是对在某个地址码对应的地址处存放的数据进行某种操作;
三地址指令的意思是,对前两个地址所对应的数据进行操作后,结果存放在第三个地址处;
二地址指令的意思是,对两个地址所对应的数据进行操作后,结果存放在后面一个地址处。
2.7.2 常用寻址方式
指令不仅要规定所执行的操作,还要给出操作数或操作数的地址。
寻址方式:指令指定操作数或操作数地址的方式。
2.7.3 指令类型
2.8 校验技术
2.8.2 循环冗余校验码
1. CRC码的生成
简称CRC码,用循环冗余的数学计算方式来检测数据的正确与否。
题目会给出用二进制数表示的原始数据信息和约定的生成多项式,经过计算后可以得到校验位,若校验位为0,则说明无错,若校验位不为0,则说明有错。
具体的计算方法这里用一个例子来讲解:
首先,要根据题目所给的原始数据信息得到对应的报文多项式,还要根据约定的生成多项式得到对应的二进制数据,再将该数据的位数减一,得到校验位数k;
其次,我们要生成校验位,就要将原始数据信息这个二进制数左移和校验位一样多的位数,也就是k,在例子中k = 3,所以对应的报文多项式就要乘以x的3次方,并得到其对应的二进制数据,作为求校验位的被除数;
同时,将生成多项式对应的二进制数作为除数,两个二进制数相除,其k位余数就是所要求的校验码。
最后,在列式计算二进制除法的时候,要注意这里需要采用 “ 模2运算 ” ,模2运算时不考虑进位和借位,当部分余数首位时1时商1,否则商0。除到被除数位数用尽时停止,此时的余数就是校验位,得到的CRC码就是原始数据的二进制数后加上校验位。
最后的余数若为0,则CRC码正确;若余数不为0,则CRC码错误。