20145223《信息安全系统设计基础》第3周学习总结

20145223 《信息安全系统设计基础》第3周学习总结

教材学习内容总结

书上内容:

p20: 三种数字:无符号数(表示大于或等于零的数)、有符号数(2进制补码)、浮点数——当计算结果太大超出了计算机的表示范围时,就会产生溢出(overflow)

p22: 进制转换,十六进制(0x或0X开头)、十进制、二进制之间的相互转换——注意拿二进制作中间结果就好转了

p25: gcc -m32 可以在64位机上(比如实验楼的环境)生成32位的代码

p26: 字节顺序是网络编程的基础,小端法:“高对高、低对低”, 大端法与之相反。

p28: 代码执行:

p32: 能区分逻辑运算(结果是1或0)和位运算(结果是位向量),所有逻辑运算都可以用与、或、非表达(最大式、最小式),而与或非可以用“与非”或“或非”表达,所以,只要一个与非门,就可以完成所有的逻辑运算。

与——&&
或——||
非——!
按位与——&
按位或——|
按位异或——^
按位取反——~
逻辑右移(算数右移)——>> +右移位
逻辑左移(算数左移)——<< +左移位

p33: 掩码是位运算的重要应用,对特定位可以置一,可以清零

p38: 要用C99中的“long long”类型,编译是要用 gcc -std=c99

p39: 补码的利用寄存器的长度是固定的特性简化数学运算。想想钟表,12-1 等价于 12 + 11,利用补码可以把数学运算统一成加法,只要一个加法器就可以实现所有的数学运算。

p44: 注意C语言中有符号数和无符号数的转换规则,位向量不变。想想第一章说的 信息就是“位+上下文”

p48: 怎么样让负数等于正数? 信息安全的逆向思维:

程序运行的结果为正数变负,负数变正,0保持不变:

p49: 0扩展和符号扩展

零扩展:将一个无符号数转换为一个更大的数据类型,在表示的开头添加“0”
符号扩展:将一个补码数字转换为一个更大的数据类型

p52: 深入思考一下代码和结果

·运行这个代码:

·出现错误:

·出现这个错误的原因是代码有错,应该将b=sum_element(a[10],0)改为b=sum_element(a,0),代码运行结果如下:

·结果应该为0但是程序运行出来的结果为1,这是因为参数length是无符号的,计算0-1进行的是无符号运算,结果得到Umax,比较使用的是无符号数进行比较,任何数小于Umax,因此比较结果为真。
·改正方法:将length改成int型或者for循环测试条件改为i<length:

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”未定义的错误:

解决过程1:经过查看代码发现书上给出的代码中没有主函数“main”,自行加上主函数后则可以运行:

课后作业中的问题和解决过程

习题2.11

代码;

运行结果:

代码调整以后的结果:

习题2.23

代码:

运行结果:

结果分析:fun1进行的是逻辑移位,fun2进行的是算数移位

本周代码托管截图——代码托管链接

其他(感悟、思考等,可选)

这一周学习的内容在于数据在计算机内的表示,包括数据的类型和不同类型间的转换以及数据的运算等,虽然知识比较琐碎也比较多,但是可以和我们之前所学过的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

参考资料

posted @ 2016-10-02 20:03  145223  阅读(221)  评论(3编辑  收藏  举报