# 2017-2018-3 20155337《信息安全系统设计基础》第3周学习总结

2017-2018-3 20155337《信息安全系统设计基础》第3周学习总结

教材学习内容总结

  • 研究数字在计算机中是如何存储的,以及值的范围和算术属性,有助于我们跨越不同的机器、系统以及编译器获得更好的可移植性。了解这些细节非常重要,程序员有责任和义务编写健壮的程序,了解其内部如何工作,其不良行为背后的原因,对于安全领域也有非常高的价值。

信息的存储:编码

单个的位没啥用处,当把位组合在一起(字节8个位),再进行某种解释,赋予不同的含义,我们就能表示世间万物了。每个程序都可以简单的视为一个字节块,程序本身就是一个字节序列。

十六进制

由于二进制信息太过冗长,于是在描述位模式的时候不是很方便,就发明了16进制。这里没什么好说的了,如下表:

  • 可以使用公式:n = i + 4j 其中n = 11 ;i的取值范围是[0-3]对应的值为:0对应1,1对应2,2对应4,3对应8相当于2的i次幂,j就代表多少个0。回到上面的例子中,11 = 3 + 4 X 2 就可以写成0X800  (j=2两个0,i=3对应8)。算是奇技淫巧吧,了解一下就可以了。
    对于16进制和10进制的相互转化就无非是反复乘以或者除以16,也没啥好说的了。

我们前面说过虚拟地址空间可以使得我们很方便的范围到每个字节,但是虚拟地址是以一个字来进行编码的,所以字的长度就决定了我们能范围的最大范围。对于我们使用的32位的计算机而言,程序最多范围2的32次方个数据,也就是我们经常所说的4GB

数据大小

关注数据大小的原因是使得程序对于不同数据类型的大小不敏感,如果我们用一个int类型(4字节)来存一个指针(64位下可能是8字节)就会带来不小的麻烦。

寻址和字节顺序

对于跨越多个字节的数据、指令和控制信息,我们必须要知道他的地址是什么,以及是按照什么顺序在计算机中存储的。对于同样的一个数字:1234567;有两种存储方法:

就数据1234567来说,它跨越了4个字节,从0x100开始到0x103结束,我们除了必须要知道开始的地址0x100外,还有一个重要的就是必须要了解是何种顺序在计算机中存储的。就具体的应用来说,至少有下面三个方面:

①通过网络在不同机器以及系统中传递数据时,必须要遵守建立的字节顺序;

②强制类型转换:不会改变真实指针,只是告诉编译器以新的类型来解释数据;

③阅读表示整数的数据类型时(不是很理解)

字符串:文本数据比二进制数据有更强的平台独立性

字符串是以null(0)字符结尾的字符数组,在任何系统上面都能看到相识的结果。但二进制机器码就不一样了:

编译成不同的机器码的结果如下:

因此:二进制代码是不兼容的,从机器的角度来看,程序仅仅只是字节序列。

布尔运算

关于布尔运算的基本的方法与、或、非、异或就不在叙述了。除了判断逻辑以外讲讲有什么用:

掩码运算:举一个例子,我们要用守蒙住脸蛋防止别人看到我们的脸,但是我们又很想看看对方长啥样子,这时候就会留一个缝隙,让眼睛可以往外边看。这基本上就是掩码的功能了。我们有选择的屏蔽了一些信号,如长相。又如:0xFF(1111 1111)任何一个数与上0xFF,就能将最低的8位保留下来。

位运算与逻辑运算的区别:逻辑运算认为非0就是true,而0表示false;逻辑运算如果第一个表达式能确定结果就不会对第二个求值。
移位运算:

对于无符号的数,右移动必须是逻辑上的。对于有符号的数,可以是任何一种,但常用的是算术右移动

教材学习中的问题和解决过程

小数值与二进制数与十进制数之间的转换

考虑二进制小数表示的一个简单方法是将一个数表示为形如x/(2^k)的小数。将这个形式表示为二进制的过程是:使用x的二进制表示,并把二进制小数点插人从右边算起的第k个位置。举一个例子,对于25/16,我们有25=11001。然后把二进制小数点放在从右算起的第4位,得至1. 1001。把分数拆分成若干形如1/(2x)之和的形式,例如25/16=1/(20)+1/(21)+1/(24),那么可以知道,小数点前为1,小数点后第一位和第四位为1,小数点后其他位为0。

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

计算机将信息按位编码,通常组织成字节序列,用不同的编码方式表示整数实数和字符
串,不同的计算机模型,在编码数字和多字节数据中的字节排序时使用不同的约定。C 语言
中的设计可以包容多种不同的字长和编码的实现,虽然高端机器逐渐开始使用64位字长,但
目前大多数及其仍使用32位。大多数机器对整数使用补码编码而对浮点数使用IEEE浮点编码
,并且理解算数运算的特性,对于想使编写的程序能在全部数值范围上正确运算的程序员来
说很正要。
在相同长度的无符号和有符号整数之间进行的强制类型转换时,大多数C 语言实现遵循
的原则是底层的位模式不变,在补码机器上,对于一个w位的值这种行为是由函数来描述的>。C语言隐式的强制类型转换会出现许多程序员无法预计的结果,常常导致程序错误。
由于编码长度有限,传统整数和实数运算相比,计算机运算具有完全不同的属性。当超>出表示范围的时候,有限长度引起的数值溢出,当浮点数非常接近0从而转换0时也会发生下
溢。
和大多数其他程序语言一样,C语言实现的有限整数运算和直式的整数运算相比,有一>些特殊的属性。例如溢出。但无符号数和补码的运算都满足整数运算的许多其他属性,包括
结合律交换律分配律,这就允许编译器做很多优化。
最常见的浮点表示方式是由IEEE 标准754定义的,我们必须非常小心地使用浮点运算,
只有有限范围和精度,且不遵守普遍的算数属性

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第五周 107/200 1/2 12

参考资料

  • 深入理解操作系统(第3版)
posted @ 2017-10-15 15:54  Twe1vE  阅读(265)  评论(0编辑  收藏  举报