2019-2020-1 20175311胡济栋 《信息安全系统设计基础》第四周学习总结教材学习
2.1信息存储
基础概念
- 机器即程序将内存视为一个非常大的字节数组,称为虚拟内存。
- 内存的每个字节都有唯一的数字标识,称为它的地址。所有可能地址的集合就称为虚拟空间地址。字长用来指明整数和指针数据的标称大小,虚拟地址空间的大小由字长决定,对于一个字长为w位的机器而言,虚拟地址的范围为0-2^w-1。
- 字节是最小的可寻址的存储器单位。
- 十六进制表示法:若位的总数不是4的倍数,最左边的一组可以少于4位,前面用0补足。字长指明整数和指针数据的标称大小。
- C语言的一个很有用的特性就是它支持按位布尔运算。
- C语言中的逻辑运算:|| OR 或;&& AND 与;! NOT 非。
- 逻辑运算符和对应的位运算之间的重要区别是:逻辑运算认为,所有非零参数都为TRUE,参数0为FALSE,返回值分别为1和0;如果对第一个参数求值就能确定表达式的结果,那么就不会对第二个参数求值。
- 一般而言,机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移在左端补k个0,得到的结果是[0,…,0,xn-1,xn-2,…,xk]。算术右移是在左端补k个最高有效位的值,得到的结果是[xn-1,…,xn-1,xn-1,xn-2,…,xk]。
字节顺序
- 字节顺序是网络编程的基础,是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。
- 排列表示一个对象的字节有两个通用的规则。某些机器选择在内存中按照从最低有效字节到最高有效字节的顺序存储对象,称为小端法;而另一些机器按照从最高有效字节到最低有效字节的顺序存储,称为大端法。
-
字节顺序可见的三种情况:
(1)网络应用程序代码编写时必须遵循已建立的关于字节顺序的规则;
(2)由反汇编器生成(反汇编器是确定可执行文件所表示的指令序列的工具);
(3)编写规避正常的类型系统的程序时,可以使用强制类型转换来允许一种数据类型引用一个对象。布尔代数
- 布尔代数起源于数学领域,是一个用于集合运算和逻辑运算的公式:〈B,∨,∧,¬ 〉。其中B为一个非空集合,∨,∧为定义在B上的两个二元运算,¬为定义在B上的一个一元运算。
- 通过布尔代数进行集合运算可以获取到不同集合之间的交集、并集或补集,进行逻辑运算可以对不同集合进行与、或、非。
-
布尔代数是研究逻辑推理的基本原则,通过布尔代数进行集合运算可以获取到不同集合之间的交集、并集或补集,进行逻辑运算可以对不同集合进行与、或、非。位向量应用于表示有限集合。
2.2整数表示
- 无符号数的编码:假设一个整数数据类型有w位。我们可以将位向量写成x→,表示整个向量,或者写成[xw-1 ,xw-2,…,x0],表示向量中的每一位。把x→看做一个二进制表示的数,就获得了x→的无符号表示。无符号二进制有一个很重要的属性,就是每个介于0~2^w-1之间的整数都有唯一一个w为的值编码,函数为一个双射。
补码编码最常见的有符号数的计算机表示方式就是补码形式。在这个定义中,将字的最高有效位解释为负权。所能表示的数值范围[-2^(w-1)~2^(w-1)-1],在可表示的范围内每个数字都有一个唯一的w位的补码编码,函数为一个双射。
注意:
(1)补码的利用寄存器的长度是固定的特性简化数学运算。
(2)补码的范围是不对称的。
(3)最大的无符号数值刚好比补码的最大值的两倍大一点:UMaxw = 2 TMaxw + 1。补码表示中所有表示负数的位模式在无符号表示中都变成了正数。- 反码除了最高有效位的权是-(2w-1-1)而不是-2w-1,它和补码是一样的。
- 原码最高有效位是符号位用来确定剩下的位应该取负权还是正权。C语言允许有符号数与无符号数之间的转换,转换的原则是底层的位表示保持不变。
- 零扩展将一个无符号数转换为一个更大的数据类型,只需要简单地在表示的开头添加0。
- 符号扩展将一个补码数字转换为一个更大的数据类型,规则是在表示中添加最高有效位的值的副本。由此可知,如果原始值的位表示为[xw-1,xw-2,…,x0],那么扩展后的表示就为[xw-1,…,xw-1,xw-1,xw-2,…,x0]。
- 截断数字将一个w位的数x=[xw-1 ,xw-2,…,x0]截断为一个k位的数字时,会丢弃高w-k位,得到一个位向量[xk-1 ,xk-2,…,x0],截断一个数字可能会改变他的值——溢出的一种形式。
-
有符号数到无符号数的隐式强制类型转换导致了某些非直观的行为。而这些非直观的特性经常导致程序错误,并且这种包含隐式强制类型转换细微差别的错误很难被发现。因为这种强制类型转换是在代码中没有明确指示的情况下发生的,程序员经常忽视了它的影响。
2.3整数运算
- 无符号加法考虑两个非负整数x和y,满足0≤x, y≤2w-1。每个数都能表示为w位无符号数字。然而,如果计算它们的和,我们就有一个可能的范围0≤x + y≤2w+1-2。表示这个和可能需要w + 1位。这种持续的“字长膨胀”意味着,要想完整地表示算术运算的结果,要对字长做限制。无符号运算可以被视为一种模运算形式。无符号加法等价于计算和模上2w。可以通过简单的丢弃x + y的w + 1位表示的最高位,来计算这个数值。
- 溢出是指完整的整数结果不能放到数据类型的总长限制中去。
- 无符号乘法范围在0≤x, y≤ 2w-1内的整数x和y可以表示为w位的无符号数,但是它们的乘积x · y的取值范围为0到(2w-1)2 = 22w-2w+1+1之间。这可能需要2w位来表示。不过,C语言中的无符号乘法被定义为产生w位的值,就是2w位的整数乘积的低w位表示的值。可以看作等价于计算乘积模2w。
-
乘常数编译器使用了一项重要的优化,试着用移位和加法运算的组合来代替乘以常数因子的乘法。将整数拆成2的幂相加,再利用移位进行计算(左移),最后将结果相加。同理,对于非负数来说,算术右移k位与除以2^k是一样的。
2.4浮点数
- 符号s决定这个数是负数(s=1)还是正数(s=0),而对于数值0的符号位解释作为特殊情况处理。
- 尾数M是一个二进制小数,它的范围是1~2-ε,或者是0~1-ε。
阶码E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)。