教材学习内容总结
浮点数编码是表示实数的科学计数法的以二为基数的版本,浮点运算是不可结合的
小端方式:低对低,高对高
浮点数的编码方式与整型数据的二进制形式适当移位会有若干个相匹配的位序列
只要一个与非门,就可以完成所有的逻辑运算
掩码可以将特定位置1,可以置0,将位向量与相应的掩码作与运算就可以
利用补码可以把数学运算统一成加法,只要一个加法器就可以实现所有的数学运算
有符号数和无符号数的转换:数值可能会改变,但是位模式不会改变(区分有符号无符号数还是依靠人的解释,也就是依靠上下文)
当参与运算时,如果一个数是有符号数,另外一个是无符号数,C语言会隐式地将有符号数转换为无符号数
无符号数转换为更大的数据类型:零扩展 补码数字转换为更大的数据类型:符号扩展
练习题2.25:我的理解是由于i是无符号数,当result-1后便转换为一个较大的无符号数,所以当i增大时,a[i]会引用到数组里不存在的数值,所以会遇到存储器错误
整数运算是一种模运算形式,表示数字的有限字长限制了可能的值的取值范围,结果运算可能溢出
浮点数的表示是不精确的,只能通过增加二进制长度来提高表示的精度,浮点运算不满足结合、性单调性
IEEE浮点标准:V=(-1)^sM2^E float(32位) double(64位)
整数与浮点数转换规则: 小数字段:丢弃开头,末位加0,凑齐23位 阶码字段:指数加上127整数运算
一个算数运算的溢出,是指完整的整数结果不能放到数据类型的字长限制中去。判断无符号运算是否溢出,例如
s=x+y(s、x、y均为无符号数)
,则唯一可靠的判断标准就是s<x
或s<y
。乘以常数:对于某个常数K的表达式x*K生成代码,编译器会将K的二进制表示表达为一组0或1的交替的序列: [(0…0)(1…1)(0…0)…(1…1)],可以用以下两种形式来计算这些乘积的结果:
A:(x<<n)+(x<<n-1)+……+(x<<m)
B:(x<<n+1)-(x<<m)
除以2的幂:设x/K,令K=2^n,
当x为正数时,计算 x>>n;
当x为负数时,将x加上偏置量,即加上2^n-1(即K-1),计算** (x+偏置量)>>n**
教材学习中的问题和解决过程
P24进制转换:首先先要装下perl软件,然后直接使用perl语句对代码进行执行
P28类型转换:
在VC中加上了main函数运行了一下(转换的数为20145311)
在实验楼中关闭警告后也可以运行(转换的数为11)
P34数组逆序排列:
当数组的元素个数为偶数的时候可以正常排序
当数组的元素个数为技术时中间的一位会是0:
原因应该是这个:奇数长度的数组当first和last都在中间时,l两个指针指向的是同一个元素,调用inplace_swap的异或操作会产生0
解决方法:既然当元素个数为奇数时,first和last最终会相等,那就不要让他们相等,将循环里的<去掉就可以了,中间那个元素不用交换
P44强制类型转换位置不变,只是改变了解释这些位的方式
课后作业中的问题和解决过程
课本上练习题:
2.6:其实书上的例子已经讲述了证书与浮点数之间的转换规则:整数写成二进制形式,再表示成科学计数法形式,阶码字段:指数加上127 小数字段:丢弃开头,末位加0,凑齐23位
2.13:bis(x,y)其实就是x与y做或运算 bic(x,y)就是x&~y
2.21:当参与运算时,如果一个数是有符号数,另外一个是无符号数,C语言会隐式地将有符号数转换为无符号数
2.23:逻辑移位、算术移位的不同
书上题目还没看完,我会再看的
本周代码托管链接
其他(感悟、思考等,可选)
本周的学习内容主要是计算机中一些数的存储、计算方式,以及各种数制之间的转换,漏洞是如何产生的,这些知识有些在之前的课程中有所接触,但是通过这周的学习,更好地知道了这些信息的表示以及存储方式与程序之间的关系。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 1/1 | 20/20 | |
第二周 | 300/500 | 1/2 | 18/38 | |
第三周 | 500/1000 | 1/3 | 22/60 | |
第四周 | 300/1300 | 1/4 | 30/90 |
参考资料
- 《深入理解计算机系统V2》学习指导
- 《深入理解计算机系统》
- ...