数制与编码
运算方法和运算电路
采用二进制编码的原因
进位计数法
计算机通常使用二进制数、八进制数和十六进制数。
进位计数法中,每个数位所用到的不同数码的个数称为基数。每个数码所表示的数值等于该数码本身乘以一个与它所在数位有关的常数,这个常数称为位权。
一个r进制数$ K_nK_{n-1}\dots K_0K_{-1}\dots K_{-m}$的数值可以表示为:
109=109D=1101101B=155O=5CH=0x5C
进制转换
将十进制数123.6875转换成二进制数
整数部分采用除基取余法:
小数部分采用乘基取整法:
真值和机器数
机器数的定点表示
原码
用机器数的最高位表示数的符号,其余各位表示数的绝对值。
+0111->0 0000111
-1011->1 0001011
反码
正数的反码与原码相同,对于负数的反码,符号位保持不变,而数值位则按位取反。
+1011->0 0001011
-1011->1 1110100
补码
正数的补码和原码相同,负数的补码等于模\(2^{n+1}\)与绝对值之差,其中n为尾数位数。
也可以采用“各位取反,末位+1”的方法得到
机器数BAH为补码,其表示的数值为多少?
BAH = 1011 1010B
符号:-
数值:011 1010-1=011 1001--取反--> 100 0110 = 70
故表示-70
移码
移码场用来表示浮点数的阶码。移码是在真值\(X\)上加上一个常数(偏置值),通常这个常数取\(2^n\)
+1011 -> 10001011
-1011 -> 01110101
同一个数的反码、移码的数值位相同,符号位相反
无符号整数
当一个编码的全部二进制位均为数值位,而没有符号位时,该编码表示就是无符号整数,简称无符号数
C语言规定了如下类型:
char默认是无符号整数,short/int/double默认是有符合整数
强制类型转换
在有符号整型和无符号整型的强制类型转换时,位值保持不变,仅改变了解释值的方式。
不同字长整数之间的转换
长->短:当长字长变量向短字长变量强制类型转换时,数值位的高位部分直接截断。
短->长:当短字长变量向长字长变量强制类型转换时,数值位的高位部分补0。
基本运算部件
全加器及其工作原理
全加器:全加器是一种用于二进制加法的基本电路元件。它的主要功能是对两个二进制数位以及一个进位输入进行加法运算。
全加器有三个输入:A加数、B加数、C来自前一位的进位输入。
全加器有两个输出:F和,加法结果的当前位;Cout进位输出,向下一位进位的值。
全加器输入和输出逻辑关系如下:
简单理解:保留计算结果的最低位。
1+1+0=10 -> F=0
简单理解:A、B、Cin只要有任意两个是1,则Cout为1。
A=1, B=1, Cin=1 -> Cout=1
带标志加法器
为了能进行有符号整数的加/减运算,需要在无符号加法器的基础上增加相应的逻辑门电路,使得加法器不仅能计算和/差,还要能生成相应的标志信息。
图:带标志加法器符号
标志信息的逻辑表达式如下:
图:带标志加法器的逻辑电路
算术逻辑单元(ALU)
ALU是一种功能较强的组合逻辑电路,它能进行多种算术运算和逻辑运算。由于加、减、乘、除运算都能归结为加法运算,因此ALU的核心是带标志加法器。
ALUop是操作控制端,用来决定ALU所执行的处理功能。ALUop的位数决定了操作的种类。
在ALUop的控制下,由一个多路选择器(MUX)选择输出三种操作结果之一。
图:一位ALU的结构
根据操作数的类型不同,移位运算可以分为逻辑移位和算术移位
逻辑移位
左移:1011->0110
右移:1011->0101
位移如何判断是否有溢出?
左移:左移前后符号位相同则没有溢出,反之有溢出;
右移:右移不会发生溢出。
算术移位
计算机中的有符号整数都是用补码表示的,因此对于有符号整数的移位操作应采用补码算术移位方式。
左移:数值位最高位移至符号位,其余为左移,最低位补零。
右移:数值位右移,最高位补符号位。
补码的加减法运算
补码运算规则如下:
溢出判别方式
设\(A\)的符号是\(A_S\),B的符号是\(B_S\),运算结果的符号是\(S_S\),则溢出逻辑表达式是:
若V=0,表示无溢出;若V=1表示有溢出。
有两种溢出情况:输入均正输出为负;输入均负输出正。
加减运算电路设计
分析下图的运算组件。
当Sub为0时,加法器计算\(X+Y\)。
当Sub为1时,加法器计算\(X+\overline{Y}+1\),相当于计算\(X-Y\)。
原码乘法
原码乘法运算分为两步:
乘法运算电路
这里讨论32位无符号数乘法,其流程如下:
图:32位无符号数乘法的运算的逻辑结构图
为便于理解,以8位无符号数为例:
计算 1101 0111 * 0010 1101
1 置零Cn=0,C=0,P|Y = 0000 0000 0000 0000,X = 0000 0000
2 输入Cn=0,C=0,P|Y = 0000 0000 0010 1101,X = 1101 0111
3 初始化Cn=8,C=0,P|Y = 0000 0000 0010 1101,X = 1101 0111
4 右移P|Y = 0000 0000 0001 0110,移出1
5 移出为1,故做加法
6 P=0000 0000 X =1101 0111,结果F=1101 0111,C=0
P|Y = 1101 0111 0001 0110
3 Cn=7
4 右移P|Y = 0110 1011 1000 1011,移出0
5 移出为0,不做加法,跳过⑥
3 Cn = 6
4 右移P|Y = 0011 0101 1100 0101,移出1
5 移出为1,做加法
6 P=0011 0101 X=1101 0111,结果F=0000 1100,C=1
P|Y = 0000 1100 0001 0110
3 Cn = 5
4 右移 P|Y = 1000 0110 0000 1011,移出0
...
除法运算
除法运算的过程可归纳为:
除法运算电路
32位int整数相除只有 \(-2^{31}/-1\)会溢出
下篇我们将分享整数的表示和运算、浮点数的表示和运算两个板块的知识点。
制作不意,请帮我点一个免费的赞,谢谢!