20145223 《信息安全系统设计基础》第3周学习总结
教材学习内容总结
书上内容:
p20: 三种数字:无符号数(表示大于或等于零的数)、有符号数(2进制补码)、浮点数——当计算结果太大超出了计算机的表示范围时,就会产生溢出(overflow)
p22: 进制转换,十六进制(0x或0X开头)、十进制、二进制之间的相互转换——注意拿二进制作中间结果就好转了
p25: gcc -m32 可以在64位机上(比如实验楼的环境)生成32位的代码
p26: 字节顺序是网络编程的基础,小端法:“高对高、低对低”, 大端法与之相反。
p28: 代码执行:
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002161238475-1026135640.png)
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002161245897-912701339.png)
p32: 能区分逻辑运算(结果是1或0)和位运算(结果是位向量),所有逻辑运算都可以用与、或、非表达(最大式、最小式),而与或非可以用“与非”或“或非”表达,所以,只要一个与非门,就可以完成所有的逻辑运算。
与——&&
或——||
非——!
按位与——&
按位或——|
按位异或——^
按位取反——~
逻辑右移(算数右移)——>> +右移位
逻辑左移(算数左移)——<< +左移位
p33: 掩码是位运算的重要应用,对特定位可以置一,可以清零
p38: 要用C99中的“long long”类型,编译是要用 gcc -std=c99
p39: 补码的利用寄存器的长度是固定的特性简化数学运算。想想钟表,12-1 等价于 12 + 11,利用补码可以把数学运算统一成加法,只要一个加法器就可以实现所有的数学运算。
p44: 注意C语言中有符号数和无符号数的转换规则,位向量不变。想想第一章说的 信息就是“位+上下文”
p48: 怎么样让负数等于正数? 信息安全的逆向思维:
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002171005108-167519894.png)
程序运行的结果为正数变负,负数变正,0保持不变:
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002171017484-1189562881.png)
p49: 0扩展和符号扩展
零扩展:将一个无符号数转换为一个更大的数据类型,在表示的开头添加“0”
符号扩展:将一个补码数字转换为一个更大的数据类型
p52: 深入思考一下代码和结果
·运行这个代码:
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002180022039-1946611007.png)
·出现错误:
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002180110527-1989383326.png)
·出现这个错误的原因是代码有错,应该将b=sum_element(a[10],0)
改为b=sum_element(a,0)
,代码运行结果如下:
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002182125487-1564030734.png)
·结果应该为0但是程序运行出来的结果为1,这是因为参数length是无符号的,计算0-1进行的是无符号运算,结果得到Umax,比较使用的是无符号数进行比较,任何数小于Umax,因此比较结果为真。
·改正方法:将length改成int型或者for循环测试条件改为i<length:
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002182856613-288647177.png)
p54: 如何让整数运算溢出?如何避免? p62例子看看
p67: 关于整数运算的最后思考:表示数字的有限字长限制了可能的值的取值范围,结果运算可能溢出。同时C 语言中的某些规定(比如unsigned数据类型),可能是产生某些难以察觉的缺陷的源头,比如书上p52的代码运行结果与预期不符,需要在以后的使用中多加注意。
p67: 浮点数有科学计数法的基础就不难理解,IEEE标准754
p68: 浮点数运算的不精确性与舍入
p70: IEEE浮点标准,float/double类型
IEE浮点标准: V=(-1)^s X 2^E X M
来表示一个数
符号:s决定这个数是正数还是负数(0的符号位特殊处理)
尾数:M是一个二进制小数,范围为1~2-ε或者0~1-ε(ε=1/2的n次幂)
阶码:E对浮点数加权,这个权重是2的E次幂(可能为负)
p74: 整数与浮点数表示同一个数字的关系
p78: 整数与浮点数转换规则
int转换为float——数字不会溢出但可能会舍入
int或float转换成double——double有更大的范围和精度所以可保留精确的数值
double转为float——可能溢出也可能舍入
float或double转为int——值会向零舍入且可能溢出
整数不确定值——浮点数转换为整数但是不能为该浮点数找到一个合理的整数近似值
代码调试中的问题和解决过程
问题1:在运行书上p28页的代码出现:对“main”未定义的错误:
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002155618921-1945852132.png)
解决过程1:经过查看代码发现书上给出的代码中没有主函数“main”,自行加上主函数后则可以运行:
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002161221505-1104255022.png)
课后作业中的问题和解决过程
习题2.11
代码;
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002191859559-26582294.png)
运行结果:
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002191917310-786912411.png)
代码调整以后的结果:
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002192138554-335132369.png)
习题2.23
代码:
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002193810624-367720825.png)
运行结果:![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002193823906-642904013.png)
结果分析:fun1进行的是逻辑移位,fun2进行的是算数移位
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002195807740-1379188754.png)
![](https://images2015.cnblogs.com/blog/890352/201610/890352-20161002195821163-521632928.png)
其他(感悟、思考等,可选)
这一周学习的内容在于数据在计算机内的表示,包括数据的类型和不同类型间的转换以及数据的运算等,虽然知识比较琐碎也比较多,但是可以和我们之前所学过的C语言课程所结合在一起进行学习。大体上看来都是一些比较基础性的东西,不是特别难懂,但是这些内容是以后进行编程实践的基础,同样需要重视和掌握。
学习进度条
|
代码行数(新增/累积) |
博客量(新增/累积) |
学习时间(新增/累积) |
重要成长 |
目标 |
4000行 |
20篇 |
400小时 |
|
第0周 |
0/0 |
1/1 |
5/5 |
|
第1周 |
0/0 |
1/2 |
10/15 |
|
第2周 |
300/300 |
1/3 |
15/30 |
|
第3周 |
200/500 |
1/4 |
10/40 |
|
参考资料