20135304刘世鹏——信息安全系统设计基础第三周学习总结
第二章 信息的表示和处理
三种重要的数字表示
无符号(unsigned)编码基于传统的二进制表示法,表示大于或者等于零的数字。
补码(two’s-complement)编码是表示有符号整数的最常见的方式,有符号整数就是可以为正或者为负的数字。
浮点数(?oating-point)编码是表示实数的科学记数法的以二为基数的版本。
信息安全系同学从逆向角度考虑为什么会产生漏洞?
答:会产生溢出。
溢出:计算机的表示法是用有限数量的位来为一个数字编码,因此当结果太大就会导致某些运算溢出。
整数和浮点数会有不同的数学属性是因为:处理数字表示有限性的方法不同:
整数:编码相对较小的数值范围,但精确度高
浮点数:编码较大范围的数,但这种表示是近似的
信息存储
1.进制
二进制、八进制、十进制、十六进制(转换:以二进制作为中间变量)
2.字
虚拟地址是以这样的一个字来编码的。 每台计算机都有一个字长,指明整数和指针数据的大小。 字长决定虚拟地址空间的最大大小。
3.字节顺序
是网络编程的基础 小端法——在存储器中按照从最低有效字节到最高有效字节的顺序存储对象。 大端法——从最高有效字节到最低有效字节的顺序存储。 (小端法:高对高,低对低。大端法:高对低,低对高。) 4.布尔代数
二进制值是计算机编码、存储、操作信息的核心(0、1)
逻辑运算——0或1 位运算————位向量 *位向量:有固定长度为w,由0、1组成的串。每个对应元素之间的运算。 掩码。通过指定一个位向量掩码,有选择的使能或不能屏蔽一些信号。(0表示被屏蔽)
5.整数表示
数据类型long long是在ISO C99中引入的。(编译:gcc -std=c99)。 64位机器用8个字节表示;32位机器用4个字节表示。 *负数的范围比整数的范围大1。
6.补码
最常见的有符号数的计算机表示方式。 正数的补码=原码 负数的补码=原码各位取反再加1 最高有效位也叫符号位。
7.无符号数与有符号数转换
强制类型转换的结果保持位值不变,改变解释这些位的方式。 处理同样字长的有、无符号数之间相互转换的规则:数值可能会变,但是位模式不变。(底层的位表示保持不变) 无————>有:U2Tw函数 有————>无:T2Uw函数 *w表示数据类型的位数。
8.扩展数字的位表示
零扩展:在开头添0。(将无符号数转换成更大的数据类型) 符号扩展:添加最高有效位的值的副本。(一个补码数字转换成更大的数据类型)
9.截断数字
可能会改变数值——溢出的一种形式。 对于无符号数字x,截断到k位,相当于计算:x mod 2(k)。(k次幂)
整数运算
一、无符号运算 无符号运算本质上就是模运算,mod 2的w次幂。
-
1.加法 涉及到的相关知识有:交换群(阿贝尔群),单位元,加法逆元等等。计算起来很简单。
-
2.乘法 两个w位的无符号数相乘,实际上是截取了低w位,但是等价于mod 2的w次幂。
总之就是模幂运算。
二、补码运算
- 1.加法 两个数的w位补码之和与无符号之和有完全相同的位级表示。
溢出
补码加法的溢出情况比无符号运算更为复杂,分为正溢出、正常、负溢出。正溢出就是超过正数的最大范围,负溢出就是超过负数的最大范围,具体的公式在书58页,正负溢出的范围和原因,直观一点的图在59页。
但是其实公式里给的本质仍然是模运算,模掉w位的补码最高有效位的权重2的w次幂。
-
2.非
-
(1)补码的非运算 对于范围在[-2^(w-1),2^(w-1))中的x,补码的非运算有如下两种情况:
x=-2^(w-1)时,为-2^(w-1)
x>-2^(w-1)时,为-x
-
(2)求位级补码非 对每一位求补,再对结果+1 设k为最右面的1的位置,将k左边的所有位取反。
-
- 3.乘法
c语言中的有符号乘法是通过将2w位的乘积截断为w位的方式实现的。也就是说,需要mod 2的w次幂。
所以:对于无符号和补码乘法来说,乘法运算的位级表示都是一样的。
三、乘以常数 在机器运算中,乘法总是很慢的,而加法和移位(左移)是相对较快的。所以在编译器中,会使用移位和加法运算组合的方式来代替乘以常数因子。这种方法对于无符号运算和补码运算都是适用的。
1.常数为2的k次幂的时候 直接左移k位即可。
2.常数不是2的整数次幂的时候 将常数C表示为2的几个整数次幂的和,结合移位运算和加法运算。
溢出?不影响结果。
四、除以2的幂 机器运算中,除法比乘法更慢。当被除数为2的整数次幂时,通过右移来解决。右移时需要区分无符号数和补码。
需要注意:整数除法总是舍入到零
1.无符号数——逻辑右移 无符号数除以2的k次幂,就等同于对其逻辑右移k位。
2.补码——算术右移 补码进行算术左移时,需要考虑补码数的正负,因为整数除法总是舍入到零,无符号数中没有负数不必担心,但补码中有正有负,正数向下舍入到零,负数应该向上舍入到零。所以这里涉及到在移位前偏置。 也就是说:
x≥0时,除以2的k次幂等价于将x算术右移k位 x<0时,先将x加上(2^k)-1,再算术右移k位 与乘法不同,这种右移方法不能推广到任意常数C。
浮点数
标准:IEEE标准754
1.二进制小数
定点表示法:“.”为界(不能有效的表示很大的数)
十进制:小数点左边的数字的权是10的非负幂,得到整数值;右边的数字的权是10的负幂,得到小数值。 二进制:小数点左边的数字的权是2的非负幂,右边的数字的权是2的负幂。 2.IEEE浮点表示
- 1.用V = (-1)s * M * 2E的形式来表示一个数:
符号:s决定这个数是负数(s = 1)还是正数(s = 0),而对于数值0的符号位解释作为特殊情况处理。
尾数:M是一个二进制小数,它的范围是1 ~ 2-ε,或者是0 ~ 1-ε。
阶码:E的作用是对浮点数据加权,这个权重是2的E次幂(可能是负数)。
- 2.将浮点数的位表示划分为三个字段,分别对这些值进行编码:
一个单独的符号位s直接编码符号s。
k位的阶码字段exp = ek-1…e1e0编码阶码E。
n位小数字段frac = fn-1…f1f0编码尾数M,但是编码出来的值也依赖于阶码字段的值是否等于0。
3.两种常见的格式
C语言中的单精度浮点格式float 和双精度浮点格式double。
在float中,s、exp和frac字段分别为1位、k = 8 位和n = 23位,得到一个32位的表示;
在double中,s、exp和frac字段分别为1位、k = 11 位和n = 52位,得到一个64位的表示。
问题与总结
对溢出的认识
溢出是黑客利用操作系统的漏洞,专门开发了一种程序,加相应的参数运行后,就可以得到你电脑具有管理员资格的控制权,你在你自己电脑上能够运行的东西他可以全部做到,等于你的电脑就是他的了。
解决方法:
- 1、改用受控代码
- 2、遵守黄金规则
- 3、编译选项 /GS
- 详情见 溢出详解(http://baike.haosou.com/doc/5959451-6172398.html)
什么是位模式
位模式:计算机中所有二进制的0、1代码所组成的数字串。比如8位的二进制数1000'0000,这个数按补码来解释就代表十进制数-128,而按原码来解释则代表128。详情见这(http://wenda.haosou.com/q/1385410325075063?src=140)