信息安全系统设计基础第三周学习总结

第二章:信息的表示和处理
一、数字表示
1、 无符号数:编码基于传统的二进制表示法表示大于或等于零的数字。
2、 补码:编码是表示有符号整数的最常见方法,可以是正或者是负的数字。
3、 浮点数:编码是表示实数的科学计数法的以二位基数的版本。
对比:
整数运算只能编码相对较小的范围,但是是精确的;
浮点运算可以编码一个较大的范围,但是是近似的;浮点运算不可结合。
注意:溢出——运算位数的限制
计算机最小的可寻址的存储器单位——字节
一个字节的值域:00H-FFH
缓冲区溢出漏洞:
计算机的表示法是用有限数量的位来对应一个数字编码,当结果太大不能表示时就会发生溢出。人为的溢出是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区这时可能会出现两种结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。
2.1信息存储
字长
机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器。存储器的每个字节都能由唯一的数字来标识,称为地址。字长用来指明整数和指针数据的标称大小,虚拟地址空间的大小由字长决定,对于一个字长为w位的机器而言,虚拟地址的范围为0-2^w-1。
数据大小
程序可移植性的要求是使程序对不同数据类型的确切大小不敏感
gcc -m32 可以在64位机上生成32位的代码

对于跨越多字节的程序对象,必须建立两个规则:
对象的地址是什么
在存储器中这些字节如何排列
多字节对象被存储为连续的字节序列,对象的地址为所使用字节中最小的地址
大端法&小端法:最低有效字节在最前面的方式称为小端法,最高有效字节在最前面的方式称为大端法。字节顺序是网络编程的基础,小端是“高对高、低对低”,大端与之相反。
字节顺序可见的三种情况:
网络应用程序代码编写时必须遵循已建立的关于字节顺序的规则
反汇编器显示(确定可执行文件所表示的指令序列的工具)
编写规避正常的类型系统的程序时,可以使用强制类型转换来允许一种数据类型引用一个对象
使用sizeof来确定对象使用的字节数,sizeof(T)返回存储一个类型为T的对象所需字节数。

布尔代数
布尔代数起源于数学领域,是一个用于集合运算和逻辑运算的公式:〈B,∨,∧,¬ 〉。其中B为一个非空集合,∨,∧为定义在B上的两个二元运算,¬为定义在B上的一个一元运算。
通过布尔代数进行集合运算可以获取到不同集合之间的交集、并集或补集,进行逻辑运算可以对不同集合进行与、或、非。
所有逻辑运算都可以用与、或、非表达(最大式、最小式),而与或非可以用“与非”或“或非”表达,所以,只要一个与非门,就可以完成所有的逻辑运算。
位向量:表示有限集合,在实际应用中位向量用来对应集合编码。
C语言的特性:支持按位布尔运算,确定一个位级表达式的结果的最好方法就是将十六进制转化为二进制进行运算后再转回十六进制。
C语言中的逻辑运算
|| OR
&& AND
! NOT
逻辑运算认为,所有非零参数都为TRUE,参数0为FALSE,返回值分别为1和0。
逻辑运算符和对应的位运算之间的重要区别是,如果对第一个参数求值就能确定表达式的结果,那么就不会对第二个参数求值,避免运算结果的错误。
C语言中的移位运算
对于一个位表示为[xn-1,xn-2,…,x0]的操作数x,C表达式x<<k会生成一个值,其位表示为[xn-k-1,xn-k-2,…,x0,0,…,0]。也就是说,x向左移动k位,丢弃最高的k位,并在右端补k个0。移位量应该是一个0~n-1之间的值。移位运算是从左至右可结合的,所以x<<j<<k等价于(x<<j)<<k。
有一个相应的右移运算x>
k,但是它的行为有点微妙。一般而言,机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移在左端补k个0,得到的结果是[0,…,0,xn-1,xn-2,…,xk]。算术右移是在左端补k个最高有效位的值,得到的结果是[xn-1,…,xn-1,xn-1,xn-2,…,xk]。
2.2整数表示
三、整数表示
1、整型数据类型:根据字节分配,不同的大小所能表示的值的范围不同。
最高位有效位也称符号位。0为正,1为负。
要用C99中的“long long”类型,编译是要用 gcc -std=c99
2、扩展一个数字的位表示:在不同字长的整数之间转换又保持数值不变。
3、符号扩展:将补码数字转换成更大类型的数据。规则在表中添加最高有效位的值的副本。
4、无符号数与有符号数转换
强制类型转换的结果保持位值不变,改变解释这些位的方式。
处理同样字长的有、无符号数之间相互转换的规则:数值可能会变,但是位模式不变。(底层的位表示保持不变)
无—>有:U2Tw函数
有—>无:T2Uw函数(w表示数据类型的位数。)
5、扩展一个数字的位表示:在不同字长的整数之间转换又保持数值不变。
0扩展:简单的在表示的开头加0。
符号扩展:将补码数字转换成更大类型的数据。规则在表中添加最高的效位的值的副本。
6、截断数字:可能会改变数值——溢出的一种形式。
对于无符号数字x,截断到k位,相当于计算:x mod 2(k)。(k次幂)
四、整数运算
1、整数运算:整数运算实际是一种模运算。表示数字的有限字长限制了可能的取值范围,结果可能溢出。补码提供了技能表示正数也能表示负数的灵活方法,同时使用了与执行无符号算数相同的位级实现。
2、补码:最常见的有符号数的计算机表示方式。
最高有效位也叫符号位。
3、正数的补码=原码
负数的补码=原码各位取反后加1
4、补码的利用寄存器的长度是固定的特性简化数学运算。利用补码可以把数学运算统一成加法,只要一个加法器就可以实现所有的数学运算。
5、C语言中有符号数和无符号数的转换规则,位向量不变。
五、浮点数
1、二进制小数:小数点左边的数字的权是2的非负幂,右边的数字的权是2的负幂。
2、IEEE浮点表示:标准 V=(-1)sM2E
(符号:s决定这个数是负数(s = 1)还是正数(s = 0),而对于数值0的符号位解释作为特殊情况处理。
尾数:M是一个二进制小数,它的范围是1 ~ 2-ε,或者是0 ~ 1-ε。
阶码:E的作用是对浮点数据加权,这个权重是2的E次幂。)
3、将浮点数的位表示划分为三个字段分别进行编码:
一个单独的符号位直接编码符号。
k位的阶码字段exp = ek-1…e1e0编码阶码。
n位小数字段,但编码出来的值也依赖于阶码字段的值是否等于0。
4、舍入:浮点运算只能近似的表示示数运算想要找到最接近x的值就是舍入,问题的关键在于在两个可能的值中间确定舍入方向。
向偶数舍入:也叫向最接近的值舍入。是默认方法。将数字向上或向下舍入使的结果的最低有效数字是偶数。
5、浮点运算:IEEE的优势可以独立于任何具体的硬件或软件实现。
浮点加法不具有结合性但满足了单调性属性。
6、C语言中的单精度浮点格式float 和双精度浮点格式double:在float中,s字段为1位、exp字段k = 8 位、frac字段n = 23位,得到一个32位的表示;在double中,s字 段为1位、exp字段k = 11 位、frac字段n = 52位,得到一个64位的表示。
四、学习心得
通过本次的学习过程,个人觉得内容还是蛮多的,尤其是在十一放假期间,就实在是有一些牵强,感觉自己又回到了高中,这并不像我所期望的大学一样轻松,不过也能感受到老师的良苦用心,自己也尽量去做,发现内容好多,书上第二章总共好几十页,有些内容都看不懂,时间也要很久才能弄懂,还得敲博客,反正是我是觉得本次的作业做的有点吃力。。。

原文地址:https://www.cnblogs.com/20135239-yxlm/p/4856223.html