数字
无符号数和有符号数
无符号数
- 寄存器长度反映无符号数长度
有符号数
- 数值部分和符号部分
- 机器数(符号数字化的数)和真值(带符号的数)
原码表示法
小数
原码特点
补码表示
-
补的概念:
-
结论:
- 负数加上模就是负数的补数
- 一个正数和负数互为补数,那么他们的绝对值之和为模数
-
正数的补数为本身
-
补码定义:
![在这里插入图片描述](https://img-blog.csd
nimg.cn/20210222223151606.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ljaHljaHljaDE=,size_16,color_FFFFFF,t_70) -
求补码快捷方式:
如果真值是负值:
原码的符号位不变,数值位取反加1
反码表示:
-
定义:
-
三种方式小结:
理解:正数的原码,符号位取反,得到的就是这个数的负数的原码,再通过对原码的取反+1得到的就是补码,因此连贯起来的操作就是正数的补码全位置取反+1得到的就是负数的补码。这里的2-n次方是因为表示的是二进制小数,+1的自然也是最后一位的数。
移码表示
补码难以直接判断真值大小
数的定点表示和浮点表示:
定点表示:
- 小数点按约定方式标出
浮点表示:
-
为什么要浮点数表示:
- 编程困难,程序员需要调节小数点的位置
- 数表示的范围小,为了能表示两个大小相差很大的数据,需要使用很长的机器字长
-
浮点表示:
-
浮点数表示形式:
浮点数的位数部分使用补码表示。
-
浮点数的表示范围:
m为阶码位数,n为尾数尾数;要保证最大正数:那么阶码为全1符号为0,尾数因为是小数,最大值为全1符号为0;最小正数:那么阶码为全1符号为0,这样保证了小数点向左移最多位,同时尾数符号为0,数字为全0,最后一个位置为1;依次类推
说明:
-
最小负数:当数符为1,尾数为全1(因为使用补码表示,所以当尾数为全1,表示的负数为最小),同时阶符为0(表示小数点向右移),阶数为全1(最大的阶数,将小数点向右移道能移的最大位置)
-
最大负数:当数符为1,尾数最后一位为1(因为这个数是能表示的最小的数字,当时加上了负号,表示的就是最大的负数),同时阶符为1,阶码为全1(表示能向左移的最大位置)
-
例题:
当m为4,表示的阶码最大可以到达15,且当精度为18位表示的最大数字与1的差距可以到达2的-18次方,可以推断可以到达±3万。
-
-
浮点数规格化形式:
r=2 尾数的最高位为1 因为这是为了保证前面无效的0都被阶码来表示了,从而能使浮点的尾数更长r=4 尾数的最高两位不全为0 因为浮点数的形式必须要0.xx的形式,但是一位以4为底的阶码表示的是将尾数左移2位,这就不能保证最高位的数字一定是1了。
r=8 尾数的最高三位不全为0 同上
解释:范围越大是因为,一位阶码表示的尾数左移尾数变多了,精度降低是因为,基数越大,就必须考虑表示出来的尾数的最高一位甚至更多位为0的情况,这就导致了精度的缺失
例子:
虽然看起来,规格化的表示正负数的最小范围没有非规格化表示的范围大,但是在1后面可以跟上更多的数,这样表示的精度也就增加了
-
例子:
-
机器0:
-
当尾数为0,阶码无论何值都表示机器0
-
阶码表示了它能表示的最小值,尾数无论为何值,当0处理
阶码为移码表示,当阶码为全0,表示的就是0
-
-
IEEE754:
定点运算
移位运算:
-
意义:
-
算数移位:
符号位不变
解释:正数的原反补都是相同的,只需要添加代码0
负数的原码和正数的原码唯一的区别就是符号位不同,因此也是添加0
负数的反码和正数的原码区别是符号位不同,且后面的0变为1,1变为0,所以原码添加的0需要变为1
负数的补码和正数的原码区别是符号,且变化规则是正数的原码通过将从右至左第一位1左边的所有位置除符号位,变化为反,右边是不变化的,所以左移添0,右移添1。
-
硬件实现:
补码:左移位丢弃1,因为对应的是真值的0,不影响,但是右移位丢弃1,对应的是真值的1,导致精度缺失
-
算数移位和逻辑移位:
加减法运算:
-
补码加减法运算公式
例子:
-
溢出判断
-
一位符号位判断
参加操作的两个操作数,符号相同,运算得到的符号不同就是溢出
最高有效位的进位和符号位的进位异或结果=1 这两个位不相同,说明了溢出,解释:当符号位变化了(表示符号位都是1,也就是负数相加的情况)当最高有效位没有变化(两个负数的最高有效位都是0,这是一个很大的数,当这里发出了进位,那么这个进位就会到符号位中,这样符号位也就变为1了,也就不会溢出),溢出
-
-
补码加减法硬件配置
乘法运算:
-
分析笔算乘法:
符号位单独处理:这个可以通过一个异或来实现
乘数的一位来判断结果是否加上被乘数
部分积相当于第一个乘数是向右移动了
-
改进:
通过不停的右移,判断是否为1,来计算
-
竖式:
通过将部分积右移的方式,当乘数为1,表示做乘1,加上被乘数,同时右移,当为0,表示做乘0,不加同时右移。
-
小结:
-
原码的乘法:
符号位单独处理,值进行乘法运算
-
递推公式:
哪个符号位的值,可以看成一个防止溢出设立的位置,并不是符号位
-
-
原码乘法硬件配置:
除法运算:
-
分析笔算除法:
-
笔算除法和机器除法的比较
-
原码除法
-
恢复余数法:
判断两个正数的大小,使用一个正数+另一个正数的负数的补码,一位第一个数是正数所以,原反补相同,第二个数是负数,所以最高位就变成了符号位。
在小数定点机中,因为商的结果只能表示为小数的形式,所以当商的结果大于1的就没有办法表示,所以当第一次上商为1,那么就发送了溢出
-
不恢复余数法:
可以看到,恢复余数法中,当余数小于0,则被除数恢复加上除数,进行左移操作,然后进行减除数,继续行一轮的余数判断,这就等于此时左移再加上余数。所以得到不恢复余数法的运算规则。
-
硬件实现
浮点运算:
浮点的加减运算:
-
对阶:
在对阶的时候,需要选择尾数右移,阶数增大的方式,这样虽然会出现数值的不准,但是丢失的精度较小。
-
规格化:
使用双符号位,00表示正,11表示负,这样可以保证溢出也能得到合适结果,当双符号位出现了01,表示最高数值位进了1(00+00=00但是结果等于了01),但是符号位没有进位,会导致正溢出;当出现10,11+11=1 10;因为最高数字为没有进位为0,符号位进位了为1,异或得1。
左归是为了保证尾数的最高位是1,所以当数位出现11和00的情况下当最高位不是对应的值1(因为尾数是补码的形式,当数位为11需要尾数为0,这个0对应的就是11中的1)需要进行左归 -
例子:
算数逻辑单元:
ALU电路:
快速进位链:
-
并行加法器:
-
串行进位链:
使用德摩根律化简
-
并行进位链:
-
单重分组进位链:
-
双重分组跳跃进位链: