20145335郝昊《信息安全设计基础》第3周学习基础
20145335 《信息安全系统设计基础》第3周学习总结
教材学习内容总结
信息的表示和处理有关知识点
-
现代计算机存储和处理信息以二值信号表示,这些二进制数字称为位。计算机用几种不同的二进制表示来编码数值。
-
计算机将信息按位编码,通常组织成字节序列。用不同的编码方式表示整数、实数 和 字符串。
-
不同的计算机模型在编码数字和多字节数据中的字节排序时使用不同的约定。
-
c语言的设计可以包容多种不同字长和数字编码的实现。大多数机器对整数使用补码编码,而对浮点数使用
IEEE
浮点编码。 -
在相同长度无符号和有符号整数之间进行强制类型转换时,大多数C语言实现遵循的原理则是底层的位模式不变。
-
在补码机器上,对于一个w位的值,这种行为是由函数
T2UW
和U2TW
来描述的 -
强制类型转换来允许以种数据类型引用一个对象,而这种数据类型与创建这个对象时定义的数据类型不同。大多数编程不推荐这种编码技巧,但是对系统级编译程序是非常有用的,甚至是必须的,但是会出现许多程序员无法预计的结果,常常导致程序错误
-
由于编码长度有限,与传统整数和实数相比,计算机运算具有完全不同的属性。当超出表示范围时,有限长度能够引起数值溢出。例如:当浮点数非常接近于0.0,从而转换成0时,也会下溢出。
-
在移位运算中,注意区分逻辑右移和算数右移。逻辑右移在左端补k个零,算数右移在左端补k个最高位有效值。左移就是向左移动k位,丢弃最高的k位,并在右端补k个零
-
c语言实现的有限整数运算和真实的整数运算相比有一些特殊属性。例如:由于溢出,200300400*500会得出结果-884 901 888(使用32位来表示数据类型int),但是无符号数和补码的运算都满足整数运算的结合律、交换律和分配律,可以允许编译器做很多的优化。
-
浮点表示通过数字编码为
x*2^y
的形式近似表示实数 -
注意因为浮点数只有有限的范围和精度,不会遵守普遍的算数属性。
教材学习中的问题和解决过程
-
关于大端法和小端法
最开始在理解两者定义的时候都没有问题,区分二者的不同在于有效字节的排列高低。最低有效字节在最前面成为小端法,最高有效字节在最前端称为大端法。
但是书上关于Ox01234567的例子为什么高位字节的十六进制是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 ; `所以在编写代码的时候容易出错,一定要区分清楚哪个是符号数哪个是无符号数。
代码调试中的问题和解决过程
-
书p28页关于强制转换
关于强制类型转换,最开始在编译代码的时候遇到了问题。
加上一个主函数
mian()
,就可以解决。
但是要注意,定义输入数字的时候需要定义成float格式,float可以强制转换成lnt格式,但是如果定义成int格式,如果定义成int格式再强制转换成float格式会发生错误。
-
书p44页关于有符号和无符号数之间相互转换
C语言允许在各种不同的数字数据类型之间做强制类型转换。
起初对于代码段
short int v = -12345 unsigned short uv = (unsigned short) v; printf(“v = %d ,uv = %u\n”,v,uv);
理解起来存在一些问题,后来套用到一个主函数中,gcc编译gdb设断点理解就会容易许多。
-
书p47页有符号数和无符号数和p49页扩展一个数字的位表示
C语言支持所有整型数据类型的有符号和无符号的运算。
将一个无符号数转换为一个更大的数据类型,在表示的开头添加0,称为零扩展。
将一个补码数字转换为一个更大的数据类型可以执行符号扩展。
将代码段套在一个main主函数中,编译运行一下就会容易理解许多。
本周代码托管截图
代码传到开源中国代码托管:https://git.oschina.net/20145335/Linux-besti-is-20145335.git
其他(感悟、思考等,可选)
已经学了三周的《深入理解计算机系统》,这周学到的知识,补码,反码等,包括溢出等知识点虽然以前在计算机导论和c语言基础的课程上都有所了解,但是将这些知识点放在一个全新的Linux系统下理解就有很多的不一样了,不论在理解方面还是运用的方面都是新的知识。需要多加练习多多巩固,虽然这周的知识都偏向于基本知识,但是编程的需要也是必不可少的,对于一些代码段的理解还是需要自己动手去实践编译和运行才能感悟更深。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 180/200 | 2/2 | 18/20 | |
第二周 | 460/500 | 2/4 | 18/38 | |
第三周 | 650/1000 | 3/7 | 54/60 | 熟练使用gcc与gdb |