《深入理解计算机系统》第2周

本周主要学习第二章信息的表示和处理,数值处理部分相对比较枯燥.第一遍看到后面定理晕头转向的,后面看第二遍的时候将所有练习题都跟着动手完成,效果明显好了很多.

对于整数运算,表示数字的有限字长限制了可能值的取值范围,结果存在溢出可能.C语言中强制类型转换等一些规定可能会产生非直观的结果,需要注意.

浮点数计算只有有限的范围和精度,并且不遵守普遍的算数属性.

重新温顾的知识点:

大端/小端法

最低有效字节在前面的是小端法,最高有效字节在最前面的是大端法. (大多数Intel兼容机都只用小端法)

假设变量x=0x01234567在地址0x100处

 |0x100 0x101 0x102 0x103|
大端 |01 | 23 | 45 | 67 |
小端 |67 | 45 | 23 | 01 |
  • 网络传输二进制数据时通过网络标准转换来避免不同机器字节顺序的影响.
  • 反汇编代码阅读时需要考虑字节顺序.
  • C语言中强制类型转换/Union允许一种数据类型引用一个对象时需要考虑字节顺序.

有符号数和无符号数之间的转换

补码转换为无符号数时

T2U(x)=x (x>=0); T2U(x)=x+2^w(x<0,w位)

无符号数转换为补码时
U2T(u)=u (u<=TMax); U2T(u)=u-2^w(u>=TMax)

C语言中对同时包含有符号和无符号数的表达式处理时,会隐式的将有符号数强制转换为无符号数,对于标准运算符并无差异,但是遇到关系运算符时会导致问题.

如 -1 < 0U, 会先将-1转换为4294967295U 导致非直观结果出现.

扩充整数字长时, 补码数符号扩展,无符号数零位扩展.

无符号整数加法

x+y=x+y(正常) x+y=x+y-2^w (溢出时)

补码加法

x+y=x+y-2^w(正溢出), x+y=x+y(正常), x+y=x+y+2^w(负溢出)

无符号数乘法

xy=(xy) mod 2^w

补码乘法

xy=U2T((xy) mod 2^w)

浮点数

通过将数字编码为x*2^y的形式来近似地表示实数,最常见的浮点精度都float和double.

IEEE浮点通过符号s/尾数M/阶码E来表示,32位1+8+23,64位1+11+52,被编码的值有三种不同的情况:

  • 规格化的值, 阶码不全为0也不全为1
  • 非规格化的值,阶码域全为0
  • 特殊值, 阶码域全为1,小数域全为0时(正无穷,负无穷); 阶码域全为1,小数域非零(NaN)

四种舍入方式中默认的是Round-to-even,将数字向上或向下舍入使得结果的最低有效数字是偶数.(可以避免统计偏差)