2017-2018-1 20179215 《深入理解计算机系统》第二章

《深入理解计算机系统》第二章学习笔记

 这章主要通过四个部分进行介绍:信息存储、整数表示、整数运算以及浮点数。重点描述了无符号数和数的补码的表示特性。我们要知道对计算机的算术运算有深刻的理解是写出可靠程序的关键,比如算术溢出就是造成程序错误和安全漏洞的一个常见根源。

一、信息存储

1. 二进制与十六进制:

 1)十六进制数字:0 – F,例子:173A4C

 2)二进制数字:0 – 1,例子:0001 0111 0011 1010 0100 1100

 3)相互转换:3位二进制数组成1位八进制数,4位二进制数组成1位十六进制数。十进制→ 十六进制:Mod(10,16)(倒序排列)

2. 字和数据大小:

 1)字长决定了系统虚拟地址空间的最大大小,对于典型32位机器而言,虚拟地址范围为0 - 232-1,程序最多访问232,所以32位机器支持最大内存为4G。

 2)一般数据类型的字节数,重点为指针类型的字节数为全字长。

3.寻址和字节顺序:

 分为大端法和小端法,IBM和Sun的个人计算机通常使用大端法。

4.布尔代数与位级运算:

 1)基本位运算符:|(逻辑或),&(逻辑与),~(逻辑非),^(逻辑异或)

布尔运算:

位及运算:

 2)重要结论:a^a = 0(通过异或交换两个变量的值)

5. 移位运算及其重要结论:

二、整数表示

 主要是对、无符号数、补码的编码,以及有符号数与无符号数之间的转换,截断数字进行了讲解。

1.无符号数的编码

2.补码的编码

3.有符号数与无符号数之间的转换

1)补码转换为无符号数

2)无符号数转换为补码

注:开始对这几个名词有混淆,但后来清楚有符号数是与无符号数相对应,而有符号数包括原码、补码、反码三种,有符号数均由符号位+数值位组成,符号位1代表负数,0代表正数,正数的补码与原码相同;负数的补码求十进制值就是按照正常二进制转换成十进制的求法,只不过最高位代表-1乘,那么已知十进制负数求其补码,除了用公式外,还可以用简便方法计算,及初符号位外,其余位取反加1,最后加上负号即可。

相应练习题:

关于有符号数和无符号数转换出现的问题:某些由于隐式强制类型转换和无符号数据类型造成的细微错误

 可看出因为参数length是无符号数的,计算0-1使用无符号运算,结果是UMAX,那么导致判断结果总为真,因此代码将试图访问数组a的非法元素。

三、整数运算

 主要是对无符号数的加法、补码加法、补码的非、无符号乘法以及补码乘法进行了讲解。

1.无符号数的加法:

重要结论:模数加法形成了阿贝尔群,可交换结合,每个元素都有一个加法逆元。

2.补码乘法:

重要结论:设为二进制表示的无符号整数,对于任意k0,有以下公式:即:一个二进制表示数乘以,相当于在位模式右边补了k个0(不溢出的情况),相当于一种移位操作,C表达式中x << k等价于 x * pwr2k,许多C语言编译器视图以移位,加法和减法的组合来消除很多整数乘以常数的情况。例如:x*14,利用等式14=,编译器将乘法重写为(x<<3)+(x<<2)+(x<<1),实现将一个乘法替换为三个移位运算和三个加法,减少时钟周期提高运算效率。

四、浮点数

1.二进制小数

2.IEEE浮点表示:

  • 符号:s通过其值1负和0正决定V的正负,对于V=0另作解释。
  • 尾数:M是一个二进制小数,它的范围是1 – 2-ε,或者0 – 1-ε
  • 阶码:E的作用是对浮点数加权,权重是2的E次幂(可能是负数)

通过将浮点数的位划分为3个字段,分别进行编码,类似科学计数法。

  • 1个单独的符号位s,直接编码符号s
  • k位的阶码字段,exp=ek-1···e0,编码解码E
  • n位的小数字段,frac=fn-1···f0,编码尾数M,但是该值依赖于E是否为0

3.浮点表示的三种情况:

1、 规格化的值

 普遍情况,当exp不全为0,也不全为1,此情况解码以偏置形式表示有符号整数,即E = e – Bias,e是无符号数,e表示为阶码位的编码ek-1···e0,而Bias是一个等于(单精度k=8,双精度k=11)的偏置值,由此产生指数的取值范围即:(单精度-126~+127,双精度-1022~+1023),对于frac解释为描述小数值f,期中0≤f<1,其二进制表示为0.fn-1···f0,当尾数定义为M = 1+f时,叫做隐含以1开头的表示,所以M = 1.fn-1···f0,因为二进制的基数是2,且我们总能在不溢出的范围内调整阶码,使得尾数M的范围总在1≤M<2中,符合IEEE定义M的范围,从而表示小数。

2、 非规格化的值

 当阶码exp域全0,阶码值为E = 1-Bias,而尾数值为M = f,不包含隐含开头都 1,非规格化的值用来表示0和非常接近0的小数,因为规格化要求M≥1,所以无法表示0,实际上+0.0的浮点表示位模式全0,而当符号位为1时候得到-0.0,逐渐溢出的属性使得数值均匀的接近0.0。

3、 特殊值

 当阶码exp域全1,当frac全0表示无穷,根据符号位的表示的正负来确定正负无穷,无穷能表示溢出的结果,当小数域非零时,NaN被称为不是一个数的缩写,一些运算结果为虚数,无法表示。

总结:

 这章重点在于对于补码的使用上,而难点在于对浮点数的理解上。并且算术溢出可能导致的程序错误及安全漏洞在练习题中也有例子说明,需要我们好好理解。

posted @ 2017-12-17 17:22  20179215袁琳  阅读(460)  评论(1编辑  收藏  举报