数据的表示和运算
进位计数制
有1到9,共十种符号
逢十进一
计算机使用二进制的原因:
- 可使用两个稳定状态的物理器件表示
- 0,1正好对应逻辑值假、真。方便实现逻辑运算
- 可很方便地使用逻辑门电路实现算术运算
任意进制—>十进制
二进制转八进制、十六进制
各种进制的常见书写方式
十进制转任意进制
真值和机器数
真值:符合人类习惯的数字
机器数:数字实际存到机器的形式,正负号需要被“数字化”
BCD码
8421码的映射关系:
1101不在映射表里
8421码中1010~1111没有定义
如果出现在(1010~10010)范围里则+6(0110)
无符号的整数的表示和运算
无符合整数,即“自然数”,0、1、2、3、4…
C语言中的无符号整数
unsigned short a=1; //无符号整数(短整型,2B)
unsigned int b=2; //无符号整数 (整型,4B)
无符号整数的表示
无符号整数:
- 全部二进制位都是数值位,没有符号位,第i位的位权是2的i-1次方
- n bit 无符号整数表示范围0~2的n次方-1,超出则溢出,意味着该计算机无法一次处理这么多
- 可以表示的最小的数全0,可以表示的最大的数全1
无符号整数的加法运算
计算机硬件如何做无符号整数的加法:从最低位开始,按位相加,并往更高位进位
计算机硬件如何做无符号整数的减法:
- “被减数”不变,“减数”全部位按位取反、末位+1,减法变加法
- 从最低位开始,按位相加,并往更高位进位
带符号整数在计算机中的应用
带符号整数,即“整数”,-2,-1,0,1,2,3,4…
C语言中的带符号整数:
short a=1;//带符号整数(短整型,2B)
int b=-2;//带符号整数(整型,4B)
原码表示
原码:
- 符号位“0/1”对应“正/负”,剩余的数值位表示真值的绝对值
- 若机器字长n+1位,带符号整数的原码表示范围-(2的n次方-1)~2的n次方-1
- 真值0有两种形式:+0和-0,[+0] = 0,0000000; [-0] = 1,0000000
原码的缺点:符号位不能参与运算,需要设计复杂的硬件电路才能处理
用补码表示真值–符号位可以参与运算
原码->反码->补码的转换
原码、补码 快速转换技巧
补码的加法运算
补码的减法运算
计算机硬件如何做带符号数补码的减法:
- “被减数”不变,“减数”全部位按位取反、末位+1,减法变加法
- 从最低位开始,按位相加,并往更高位进位
原反补码的特性对比
原码和反码的合法表示范围完全相同,都有两种方法表示真值0
补码的合法表示范围比原码多一个负数,只有一种方法表示真值0
移码
原、反、补、移码的转换
移码:补码的基础上将符号位取反。注意:移码只能用于表示整数
各种码的基本特性总结
原码和反码的合法表示范围完全相同,都有两种方法表示真值0
补码的合法表示范围比原码多一个负数,只有一种方法表示真值0
移码的合法表示范围比原码多一个负数,只有一种方法表示真值0
用几种码表示整数
定点整数、定点小数
原码
定点小数原/反/补码的转换
定点小数的加/减运算
对两个定点小数A、B进行加法/减法时,需要先转换为补码
计算机硬件如何做定点小数补码的加法:从最低位开始,按位相加(符号位参与运算),并往更高位进位
计算机硬件如何做定点小数补码的减法:
- “被减数”不变,“减数”全部位按位取反、末位+1,减法变加法
- 从最低位开始,按位相加,并往更高位进位
定点小数VS定点整数
位数扩展时,扩展位置不一样
小数补码的加法运算
计算机硬件如何做补码的加法:从最低位开始,按位相加(符号位参与运算),并往更高位进位
奇偶校验码
奇校验码:整个校验码(有效信息位和校验位)中“1”的个数为奇数
偶校验码:整个校验码(有效信息位和校验位)中“1”的个数为偶数
电路的基本原理、加法器设计
算术逻辑单元(ALU)
最基本的逻辑运算
复合逻辑
一位全加器
串行加法器
并行加法器
并行加法器的优化
补码加减运算器
加法器原理
补码加/减法运算方法
标志位生成
定点数的移位运算
移位:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法
原码的算数移位
原码的算数移位–符号位保持不变,仅对数值位进行移位
右移:高位补0,低位舍弃。若舍弃的位=0,则相当于/2;若舍弃的位≠0,则会丢失精度
左移:低位补0,高位舍弃。若舍弃的位=0,则相当于*2;若舍弃的位≠0,则会出现严重误差
定点小数同理
反码的算数移位
反码的算数移位–正数的反码与原码相同
因此对正数反码的移位运算也和原码相同
右移:高位补0,低位舍弃
左移:低位补0,高位舍弃
反码的算数移位–负数的反码数值位与原码相反
因此负数反码的移位运算规则如下
右移:高位补1,低位舍弃
左移:低位补1,高位舍弃
补码的数移位
补码的算数移位–正数的补码与原码相同
因此对正数补码的移位运算也和原码相同
右移:高位补0,低位舍弃
左移:低位补0,高位舍弃
补码的算数移位–负数补码=反码末位+1
导致反码最右边几个连续的1都因进位而变为0,
直到进位碰到第一个0为止
规律–负数补码中,最右边的1及其右边同原码。
最右边的1的左边同反码
负数补码的算数移位规则如下:
右移(同反码):高位补1,低位舍弃
左移(同原码):低位补0,高位舍弃
算数移位
原码乘法运算
补码乘法运算
原码的除法运算
手算除法
手算除法(二进制)
原码除法:恢复余数法
原码除法:恢复余数法(手算)
原码除法:加减交替法(不恢复余数法)
定点数 补码除法运算
补码除法:加减交替法
强制类型转换
无符号数与有符号数;不改变数据内容,改变解释方式
short x=-4321;
unsigned short y=(unsigned short) x;
x:1110 1111 0001 1111 = -4321
y:1110 1111 0001 1111 = 61215
长整数变短整数;高位截断,保留低位
短整数变长整数;符号扩展
short x=-4321;
int m=x;
unsigned short n=(unsigned short)x;
unsigned int p=n;
x:1110 1111 0001 1111
m:1111 1111 1111 1111 1110 1111 0001 1111 真值-4321
n:1110 1111 0001 1111 真值
p:0000 0000 0000 0000 1110 1111 0001 1111 真值61215
数据的存储和排列
大小端模式
边界对齐
现代计算机通常是按字节编址,即每个字节对应1个地址
通常也支持按字、按半字、按字节寻址
假设存储字长为32位,则1个字=32bit,半字=16bit,每次访存只能读/写1个字
浮点数的表示
从科学计数法理解浮点数
浮点数:
阶码E反映浮点数的表示范围及小数点的实际位置
尾数M的数值部分的位数n反映浮点数的精度
尾数给出一个小数,阶码指明了小数点要向前/向后移动几位
例:阶码、尾数均用补码表示,求a、b的真值
a= 0 01 1.1001
a的阶码真值为 1
尾数的原码为 1.0111 对应真值为 -0.0111
a的真值为 2的1次方*(-0.0111)=-0.111
b= 0 10 0.01001
b的阶码真值为 2
尾数的原码为 0.01001 对应真值为 0.01001
b的真值为 2的2次方*0.01001=1.001
浮点数尾数的规格化
规格化浮点数:规定尾数的最高数值位必须是一个有效值
左规:当浮点数运算的结果为非规格化时要进行规格化处理,将尾数算数左移一位,阶码减1
右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10),将尾数算数右移一位,阶码加1
规格化浮点数的特点
1.用原码表示的尾数进行规格化:
规格化的原码尾数,最高数值位一定是1
正数为0.1XX…X的形式,其最大值表示为0.11…1;最小值表示为0.10…0。
尾数的表示范围为1/2<=M<=(1-2的负n次方)
负数为1.1XX…X的形式,其最大值表示1.10…0;最小值表示为1.11…1
尾数的表示范围为-(1-2的负n次方)<=M<=-1/2
2.用补码表示的尾数进行规格化:
规格化的补码尾数,符号位与最高数值位一定相反
正数为0.1XX…X的形式,其最大值表示为0.11…1;最小值表示为0.10…0。
尾数的表示范围为1/2<=M<=(1-2的负n次方)
负数为1.0XX…X的形式,其最大值表示1.01…0;最小值表示为1.00…0
尾数的表示范围为-1<=M<=-(1/2+2的负n次方)
IEEE754
移码
移码:补码的基础上将符号位取反。注意:移码只能用于表示整数
移码的定义:移码=真值+偏置值
此处8位移码的偏置值=128D=1000 0000B
IEEE754标准
浮点数的运算
浮点数加减运算步骤:
1.对阶、2.尾数加减、3.规格化、4.舍入、5.判溢出
舍入