【计算机组成原理】数据的表示和运算

定点数原码、反码、补码和移码的表示范围

定点整数

原码

以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,00000001,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,00000001,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)

可以看到补码的规格化数的范围相当于原码向左平移了一个数。
这里可简记为补码规格化数的尾数的最高位一定与尾数符号位相反。
在写选择题的时候,可以把补码转换为原码来判断题目给出的数是否为规格化数。

浮点数运算的陷阱和小知识点

  • int转换为float时,虽然不会发生溢出,但由于尾数位数的关系,可能有数据舍入,从而产生误差,而转换为double则能保留精度。牢记没有精度损失的转换过程char->int->long->double
  • 浮点数的计算可能会损失精度,特别是指数相差巨大的浮点数做运算。[《王道》P66t3【2010统考真题】]说法IV。(d+f)-d=f不成立(因为d和f指数相差巨大,计算的时候发生了舍入误差)
  • 牢记浮点数的舍入有两种情况:对阶右规格化
  • 双符号位的最高符号位代表真正的符号,而低位符号位用于参与移位操作以判断是否发生溢出。

按边界对其存储

**定义:**即对于存放某长度为m字节的数据,存放地址需在m字节的整数倍存放,结构体整体的大小是最大成员长度的整数倍。
例题: 《王道》P47t4【2012统考真题】

条件码

选择题和综合体可能涉及,要熟记其含义。

条件码 含义
CF:进位标志 最近的操作数使最高位产生了进位。可用来检查无符号操作的溢出
ZF:零标志 最近的操作得出的结果为0
SF:符号操作 最近得到的结果为负数
OF:溢出标志 最近的操作导致一个补码溢出——正溢出或负溢出

真题题型总结

选择题

  • 和C语言结合,考察基本数据类型之间的计算和溢出问题。这部分的技巧在于转换成真值的计算,然后考虑计算结果是否在数据类型的表示范围之内。
  • 考察数据类型在内存中的位置,结合按边界对其存储以及大端模式/小端模式的理解。注意大端模式/小端模式针对的是字,这里见[《王道》P53t58【2018统考真题】]的A选项和B选项。
  • 考察数据类型转换,特别是浮点数的转换,见上文。
  • 考察IEEE754浮点数的表示范围(虽然说考纲已经删除,但18年的真题依然考察了该知识点)。这里主要记住IEEE754单精度指数的范围是-126~127,双精度指数的范围是-1022~1023。
  • 考察对阶、规格化、舍入、尾数溢出和溢出的关系。下面是正确说法
    • 对阶操作不会引起阶码上溢或者下溢。
    • 右规和尾数舍入都可能引起阶码上溢。
    • 左规时可能引起阶码下溢。
    • 尾数溢出时结果不一定溢出。

综合题

  • 同选择题部分。
  • 11年考了两个论述的小问,涉及到加法器辅助电路和溢出的判断。《王道》P53t2【2011统考真题】(答案在P60页)

参考资料

《2020年计算机组成原理考研复习指导》——王道论坛

小记

这部分第一次学的时候感觉还是挺难的,第二第三遍复习思考之后,就觉得清晰起来。暂时还没有想到更多,如有补充,欢迎交流。

你可能感兴趣的:(#,计算机组成原理)