20155336 2017-2018 1 《信息安全系统设计基础》第3周学习总结
本周学习目标
1:理解二进制在计算机中的重要地位
2:掌握布尔运算在C语言中的应用
3:理解有符号整数、无符号整数、浮点数的表示
4:理解补码的重要性
5:能避免C语言中溢出,数据类型转换中的陷阱和可能会导致的漏洞
6:进一步理解“信息=位+上下文”
《深入理解计算机系统》第2章 信息的表示和处理
信息的表示和处理有关知识点
-
现代计算机存储和处理信息以二值信号表示,这些二进制数字称为位。
-
计算机将信息按位编码,通常组织成字节序列。
-
在相同长度无符号和有符号整数之间进行强制类型转换时,大多数C语言实现遵循的原理则是底层的位模式不变。
-
在补码机器上,对于一个w位的值,这种行为是由函数
T2UW
和U2TW
来描述的。 -
由于编码长度有限,与传统整数和实数相比,计算机运算具有完全不同的属性。当超出表示范围时,有限长度能够引起数值溢出。例如:当浮点数非常接近于0.0,从而转换成0时,也会下溢出。
-
浮点表示通过数字编码为x*2^y的形式近似表示实数。
-
注意因为浮点数只有有限的范围和精度,不会遵守普遍的算数属性。
-
通过移位来进行乘法运算
- 教材2.4:若x需要乘以一个数k,则将k分解为2的指数的加减法,幂级数代表移位数,随后用加减的正负号来连接。
-
教材P28的代码,自己添加main来进行测试
- 教材P35的代码
- 教材P49的代码
教材学习中的问题和解决过程
-
关于大端法和小端法
最开始理解定义没什么问题,区分不同的地方在于有效字节的排列。最低有效字节在最前面成为小端法,那么最高有效字节在最前端称谓大端法。
但是书上习题 Ox01234567的例子为什么高位字节的16进制是Ox01 低位时Ox67?
看过课后习题关于Ox87654321的例子明白了,因为每个十六进制的数字,在地址排列中有两个通用规则。考虑一个w位的数,位表示为[Xw-1,Xw-2,...,X1,X0]其中Xw-1是最高位,X0是最低位.这样一来就可以明白高位字节是Ox01,低位字节是Ox67,这样问题就顺利解决了。
-
关于表示字符串
通过以前的学习也知道是由一张ASCII字符码表,但是对于使用使用ASCII作为字符码的任何系统上会得到相同结果,与字节顺序和字大小规则无关并不太理解。
在虚拟机下使用man ascii得到一张ASCII表,并用书上的例子
const cahr *s ="abcdef" show_bytes( (byte_pointer)s,strlen(s));
解决了这一问题。
-
关于掩码
掩码是位模式,表示从一个字中选出位的集合。根据计算
x&OxFF
生成一个由x的最低有效字节组成的值,而其他的字节就被置为0。书上的例子X=Ox89ABCDEF
和OxFF
做&
运算,为什么是Ox000000EF
,原来运算需要换算成二进制数才可以,十六进制不可以运算。 -
关于有符号数和无符号数
创建无符号常量,必须加上后缀字符“u”或者“U”。允许无符号数和有符号数之间的转换,转换的原则是底层位保持不变。在转换时候可以采用隐式,这样就解决了书上p48的练习遇到的问题。
隐式类似于:
int x,y; unsigned ux, uy; x=ux; y=uy;
因为在代码段中省略了x=(int)ux ;所以在编写代码的时候容易出错,一定要区分清楚哪个是符号数哪个是无符号数。
代码托管
其他(感悟、思考等,可选)
这周学到的知识,补码,反码等,包括溢出等知识点虽然以前在计算机导论和c语言基础的课程上都有所了解,但是将这些知识点放在一个全新的Linux系统下理解就有很多的不一样了,不论在理解方面还是运用的方面都是新的知识。
我们一定要把概念搞清楚,才会少犯这种低级的错误,还是得把基础搞牢。计算机和人不一样,我们要慢慢的去习惯这种计算机式的思维方式,有利于提高我们的编程能力。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 10 /10 | 1/1 | 10/10 | |
第二周 | 60 /70 | 2/4 | 18/38 | |
第三周 | 170/200 | 3/7 | 15/60 |
-
计划学习时间:15小时
-
实际学习时间:15小时
-
改进情况:多提出问题,多解决问题。
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)