1、“821.2016T1(1)”,表示821真题,2016年的题,T1是 选择题/填空题/大题 的第一题,其他类似标记也是相通
2、个人小白总结自用,不一定适用于其他人,请自行甄别
3、有任何疑问,欢迎私信探讨,看到后会及时回复
选择题
- IEEE754规范:阶码决定该数据的类型
规格化:阶码不为全0,不为全1
非规格化:阶码全0
无穷大:阶码全1,且尾数=0
NaN:阶码全1,且尾数≠0,(Not a Number,非数)
- 浮点数加减运算:(手势:右手握拳大拇指向上,左手握拳大拇指向下)
(右上)阶码上溢:右规、尾数舍入
(左下)阶码下溢:左规(数字左移)
尾数溢出,结果不一定溢出
双、单符号位加减产生的进位自然舍去,所以不算溢出
但是要是尾数右规,所导致阶码溢出,则表示结果溢出
对阶操作不会引起阶码上溢或下溢(因为是小阶向大阶对阶)
填空题
- 浮点数加减运算,尾数右移的2种情况
尾数对阶
规格化与判溢出
- 寄存器里面是补码,(FFFF FF80)补 = -128(821.15.T3)
- 32位的机器上运行,int、short,x=127,y==-9,执行z=x+y,x、y、z的机器数:都要用32位表示出来(821.16.T2)
- 原码一位乘,n次移位,最多n次加法;Booth一位补码,n次移位,最多n+1次加法
移动次数 | (最多)加法次数 | ||
原码一位乘法 | 部分积 乘数+0 | n | n |
补码一位乘法/Booth | 部分积 乘数+1 | n | n+1 |
补码两位乘法/Booth | 部分积 乘数+1 | n/2 | (n/2) +1 |
原码一位除法 | 被除数/余数 商+1 | n | n+1 |
补码一位除法 | 被除数/余数 商+1 | n | n |
简答题
大题
舍入规则
浮点数:尾数求和、规格化浮点数≠IEEE754规格化浮点数
- 规格化浮点数
尾数:0.1…
阶码:补码,无偏移量
- IEEE754规格化浮点数
尾数:1.0…,1.1…,首位1隐含
阶码:移码,float单精度是127的偏移量
0舍1入:可能导致最终结果需要右移1位,阶码+1后上溢
.0001 1 = .0010(入)
.0001 0 = .0001(舍)
规格化浮点数加/减法
- 4个答题步骤
- 对阶,其实是:用大阶的码,将小阶的尾数右移,进行舍入操作
- 注意补码右移,是算术右移,是补符号位
原码1位乘法/除法
- 符号位、数值位分开求
- 2个符号位异或,相同为0
- 部分积0.0000
- 乘数只写小数点后面的数值部分
- 直接用原码化成十进制的小数,检验相乘的答案
补码一位乘法/除法
注意题中所给的数据,是原码还是补码(821.15.T1,给的就是补码)
原码/反码/补码/IEEE754码
- 真值转原码 = 十进制转二进制原码
带符号的数值,转二进制时,最高位是数值位
- 原码转补码
正数补码直接就是自己的原码
负数的补码才要转换,规则:除去最高位符号位不动,其他位全反+1
- [A]补 转 [-A]补,直接全反+1,包括符号位
- 单精度浮点数IEEE754加法
数符S + 阶码E + 尾数M = 32 = 1 + 8 + 23
偏置值 = 127 = 0111 1111
E(阶码)=真值+偏置值
尾数用原码,阶码用移码
隐含:①基数是2;② 尾数是1.开头的
- 寄存器的加减运算
寄存器的内容 = 补码
带符号整数补码加法
一个正数,一个负数相加,不会溢出
只有同正、同负的才会溢出
------------------------------------------------------------------------
例如:寄存器R1的内容 = C4C4 8000 H
C4C4 8000 H = 1100 0100 1100 0100 1000 0000 0000 0000 B,这是寄存器里面的内容,所以是补码(最高位的1,是符号位)
补码转原码,除符号位直接全反+1,原码 = 1011 1011 0011 1011 1000 0000 0000 0000 B = - 3B3B 8000 H
- 3B3B 8000 H,可以直接在答题卡写:-(3x
+ 11x
+ 3x
+ 11x
+ 8x
)
- 8位二进制加法器,画图(821.12.T1(3))
1位半加器
1位全加器
8位串行加法器(带溢出判断)
并行加法器(暂未强制考)
补充知识点
逻辑位移(无符号数)
算术位移 (有符号数) 只移动数值部分 | 补填数值 | 左移高位, 溢出(结果出错) | 右移低位, 丢失精度 | |
正数 | 原=反=补 | 0 | 丢1时 | 丢1时 |
负数 | 原码 | 0 | 丢1时 | 丢1时 |
反码 | 1 | 丢0时 | 丢0时 | |
补码 | 左移0,右移1(符号位) | 丢0时 | 丢1时 | |
总结 | 1、负数的原码,与正数原码完全相同,与自己负数反码完全相反 2、负数的补码:左移丢0【和反码丢的相同】溢出,右移丢1【和原码丢的相同】丢失精度 3、符号位,不参与位移(王道.P48.T11&T12) 双符号位是,最高位不参加,次高位参加位移(王道.P50.T27) 4、[X]补=X0.X1X2…,其中X0为符号位,X1为最高位,只要 ? 则补码左移时将会发生溢出(王道.P29.T19) 5、补码时,正数符号位0,左移0时,数据不丢失;负数符号位1,左移1时,数据不丢失(王道P50T27) |
算术位移 & 逻辑位移
- 算术位移,与其他位移不同的是:符号位不变,仅仅是其他位的位移而已
- 算术右移,符号位不变,最低位移入进位标志位
- 不带进位的循环,就是不用管CF(进位标志位),直接数值位循环左移和右移就可以
有无符号转换
有无符号转换 | 十六进制 (寄存器里的二进制) | 真值 | 十六进制 | 真值 | 方法总结 | ||
低->高 | 有符short | FFFA | -6 | 有符int | FFFF FFFA | -6 | |
有符short | -6 | 无符int | FFFF FFFA | 将 FFFF FFFA 转为10进制 4294967290 | ①有符short ②有符int(同①类型扩位) ③无符int | ||
无符short | 65530 | 有符int | 0000 FFFA | 65530 | ①无符short ②无符int(同①类型扩位) ③有符int | ||
无符short | 65530 | 无符int | 0000 FFFA | 65530 | |||
相同类型 | 有符short | FFFA | -6 | 无符short | FFFA | 65530 | ①寄存器之间二进制不变,且都是补码 ②唯一改变的就是符号位是否数值化 |
无符short | FFFA | 65530 | 有符short | FFFA | -6 | ||
高->低 | 有符int | FFFF FFFA | -6 | 有符short | FFFA | -6 | 高位转低位,直接高位截断 |
有符int | -6 | 无符short | 65530 | ||||
无符int | 将 FFFF FFFA 转为10进制 4294967290 | 有符short | -6 | ||||
无符int | 将 FFFF FFFA 转为10进制 4294967290 | 无符short | 65530 |
#include <stdio.h>
int main()
{
/* 有符号用%d输出,无符号用%u输出 */
short a = 65530;
unsigned short b = a;
printf("%d %u", a , b);
return 0;
}
/* 参考博客:https://blog.csdn.net/qq_38608897/article/details/103966054 */
/* C语言在在线运行器:https://c.runoob.com/compile/11/ */