以8位字长为例,我们知道8位字长可以表示0到(2^8)-1总共256个数,因为原码中,0有两种表示方法。0,000000和1,000000(假设1位符号位,7位数值位),所以可以表示255个数,即-127到+127。
而8位字长的补码可以表示-128到+127,因为补码的0表示是唯一的。即0,0000000。而1,0000000在补码中表示的是 10 , 0000000 − 1 , 0000000 = − 128 10,0000000 - 1,0000000 = -128 10,0000000−1,0000000=−128
因为反码在表示正数时和原码相同,在表示负数时相当于原码的数值位取反。所以它的性质,表示范围,表示的数字的个数都和原码一样。
还以8位字长来表示,使用原码、反码和补码的时候,8位字长的第一位表示的是数符,所以实际表示数字绝对值的只有7位。在8位字长的无符号数下可以表示0-255,而我们希望不将首位作为符号位的同时又能表示负数,那么怎么做呢,使用移码。移码可以理解成映射,将[0,255]映射到[-128,127],同样是256个数字。从右边(实际表示的数字)到左边(移码表示的形式)的变换是加上128,正好是10000000。变化所以00000000表示的是-128,而10000000表示的是0。
通过上述我们可以发现,同样字长的情况下,原码和反码表示的数字要少一个,因为它们都用两个编码来表示0。而补码和移码不存在这种情况,所以同样的字长,补码和移码都比原码和补码多表示一个数字-2^n(设字长为n+1)。再次切记,正数的原码、反码和补码都相同。
和定点整数一样,原码用1,0000000和0,0000000来表示0,所以原码无法表示-1。
1,0000000在补码中表示的是 10 , 0000000 − 1 , 0000000 = − 1 10,0000000 - 1,0000000 = -1 10,0000000−1,0000000=−1
这里和定点整数是一样的道理,区别只是因为定点小数无论字长多长,表示的最小值都是-1,而不像定点整数,字长越长,表示的最小值越小。
同原码
基本上理解了定点整数,定点小数就呼之欲出了。
关于数据的表示,还涉及到符号扩展,左移右移时补码负数添0或添1的问题。这部分我们都用一个过程来理解而不需要死记硬背。这个过程就是关于负数在原码和补码之间的转换。
分析由原码得到补码的过程发现,当对其低位向高位找到第一个“1”时,在此“1”左边的各位均与对应的反码相同,而在此“1”右边的各位(包括此“1”在内)均与对应的原码相同。
简单来说,从数值位从右往左找到第一个1,在此1和此1的右边不变,左边取反。即完成负数原码和补码的转换。
按照上面的分析,左边应该添加的是0的反码,右边应该添加0的原码。而整数的符号扩展是在左边补数,小数的符号扩展是在右边补数。所以负数补码的附加位都用1(对于整数)或0(对于小数)填充
和上面同理,左移的时候是右边补数,所以补0,左边补1。
因为逻辑移位将操作数视为无符号数,所以逻辑移位不管是左移还是右移,都添0。
编码 | 最大值 | 最小值 | 表示范围 |
---|---|---|---|
原码 | 1.10…0 | 1.11…1 | -(1-2^-n)<=M<=-1/2 |
补码 | 1.01…1 | 1.00…0 | -1<=M<=-(1/2-2^-n) |
可以看到补码的规格化数的范围相当于原码向左平移了一个数。
这里可简记为补码规格化数的尾数的最高位一定与尾数符号位相反。
在写选择题的时候,可以把补码转换为原码来判断题目给出的数是否为规格化数。
**定义:**即对于存放某长度为m字节的数据,存放地址需在m字节的整数倍存放,结构体整体的大小是最大成员长度的整数倍。
例题: 《王道》P47t4【2012统考真题】
选择题和综合体可能涉及,要熟记其含义。
条件码 | 含义 |
---|---|
CF:进位标志 | 最近的操作数使最高位产生了进位。可用来检查无符号操作的溢出 |
ZF:零标志 | 最近的操作得出的结果为0 |
SF:符号操作 | 最近得到的结果为负数 |
OF:溢出标志 | 最近的操作导致一个补码溢出——正溢出或负溢出 |
《2020年计算机组成原理考研复习指导》——王道论坛
这部分第一次学的时候感觉还是挺难的,第二第三遍复习思考之后,就觉得清晰起来。暂时还没有想到更多,如有补充,欢迎交流。