20145306《信息安全系统设计基础》第3周学习总结
教材学习内容总结
一、信息储存
C表示法:以0x或0X开头的数字常量为十六进制
二进制、八进制、十进制、十六进制(转换:以二进制作为中间变量)
二进制-十六进制相互转换,二进制的四位数字对应十六进制的一位数字
二进制与八进制的转化是三位对应一位
虚拟地址是以这样的一个字来编码的
每台计算机都有一个字长,指明整数和指针数据的大小
字长决定虚拟地址空间的最大大小
字长为w,虚拟地址的范围为1-(2^w-1)
w=32或64:通常说的电脑是32位还是64位,(CPU一次处理数据的位数
寻址和字节顺序
小端法——在存储器中按照从最低有效字节到最高有效字节的顺序存储对象(高对高,低对低)
大端法——从最高有效字节到最低有效字节的顺序存储(高对低,低对高)
表示字符串
c语言中字符串被编码成为一个以null(值为0)字符结尾的字符数组(多使用ASCII字符码)
使用ASCII字符码的任何系统上都能得到相同的结果,与字节顺序和字大小规则无关
表示代码
二进制代码在不同的操作系统上有不同的编码规则,二进制代码不兼容
布尔代数
二进制值是计算机编码、存储、操作信息的核心(0、1)
位级运算
位运算————位向量(有固定长度为w,由0、1组成的串,每个对应元素之间的运算)
掩码:通过指定一个位向量掩码,有选择的使能或不能屏蔽一些信号(0表示被屏蔽)
位级表达式的计算,要将通过转化为二进制表示进行二进制运算再转换回原来的进制来进行
~0:生成一个全1的掩码
逻辑运算
逻辑运算——0或1
所有非零参数都代表TRUE,0参数代表FALSE
与位运算的区别:只有当参数被限制为0或1时,逻辑运算才与按位运算有相同的行为;如果对第一个参数求值就能确定表达式的结果,逻辑运算符就不会对后面的参数求值
移位运算
逻辑右移:在左端补k个0,多用于无符号数移位运算
算术右移:在左端补k个最高有效位的值,多用于有符号数移位运算
(算术左移和逻辑左移没有什么区别)
移位运算的优先级比算术运算(比如+、-)要低
整数表示:
无符号数的编码
:假设一个整数数据类型有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],截断一个数字可能会改变他的值——溢出的一种形式。有符号数到无符号数的隐式强制类型转换导致了某些非直观的行为。而这些非直观的特性经常导致程序错误,并且这种包含隐式强制类型转换细微差别的错误很难被发现。因为这种强制类型转换是在代码中没有明确指示的情况下发生的,程序员经常忽视了它的影响。
整数运算
符号加法
考虑两个非负整数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是一样的。
IEEE浮点标准用V = (-1)^s × M × 2^E的形式来表示一个数:
符号
s决定这个数是负数(s=1)还是正数(s=0),而对于数值0的符号位解释作为特殊情况处理。
尾数
M是一个二进制小数,它的范围是1~2-ε,或者是0~1-ε。
阶码
E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)。 将浮点数的位表示划分为三个字段,分别对这些值进行编码:
一个单独的符号位s直接编码符号s。
k位的阶码字段exp = ek-1…e1e0编码阶码E。
n位小数字段frac = fn-1…f1 f0编码尾数M,但是编码出来的值也依赖于阶码字段的值是否等于0。 给定了位表示,根据exp的值,被编码的值可以分为以下三种情况:
情况1:规格化的值 当exp的位模式既不全为0(数值0),也不全为1(单精度数值为255,双精度数值为2047)时,都属于这类情况。在这种情况中,阶码字段被解释为以偏置(biased)形式表示的有符号整数。也就是说,阶码的值是E = e-Bias,其中e是无符号数,其位表示为ek-1…e1e0,而Bias是一个等于2k-1-1(单精度是127,双精度是1023)的偏置值。由此产生指数的取值范围,对于单精度是-126~+127,而对于双精度是-1022~+1023。
情况2:非规格化的值 当阶码域为全0时,所表示的数就是非规格化形式。在这种情况下,阶码值是E = 1 - Bias,而尾数的值是M = f,也就是小数字段的值,不包含隐含的开头的1。非规格化值要这样设置偏置值的原因是使阶码值为1-Bias而不是简单的-Bias似乎是违反直觉的。我们将很快看到,这种方式提供了一种从非规格化值平滑转换到规格化值的方法。 非规格化数有两个用途:首先,它们提供了一种表示数值0的方法,因为使用规格化数,我们必须总是使M≥1,因此我们就不能表示0。另外一个功能是表示那些非常接近于0.0的数。它们提供了一种属性,称为逐渐溢出,其中,可能的数值分布均匀地接近于0.0。情况3:特殊值 当指阶码全为1的时候出现的。当小数域全为0时,得到的值表示无穷,当s = 0 时是+∞,或者当 s = 1时是-∞。当我们把两个非常大的数相乘,或者除以零时,无穷能够表示溢出的结果。
舍入
因为表示方法限制了浮点数的范围和精度,浮点运算只能近似地表示实数运算。因此,对于值x,我们一般想用一种系统的方法,能够找到“最接近的”匹配值x',它可以用期望的浮点形式表示出来。
IEEE浮点格式定义了四种不同的舍入方式。默认的方法是找到最接近的匹配,而其他三种可用于计算上界和下界。其他三种方式产生实际值的确界。这些方法在一些数字应用中是很有用的。向零舍入方式把正数向下舍入,把负数向上舍入,得到值x^,使得| x ^|≤| x |。向下舍入方式把正数和负数都向下舍入,得到值x-,使得x-≤x。向上舍入方式把正数和负数都向上舍入,得到值x+,满足x≤x+。
浮点运算
IEEE标准指定了一个简单的规则,用来确定诸如加法和乘法这样的算术运算的结果。把浮点值x和y看成实数,而某个运算⊙定义在实数上,计算将产生Round (x ⊙ y),这是对实际运算的精确结果进行舍入后的结果。当参数中有一个是特殊值(如-0、-∞或NaN)时,IEEE标准定义了一些使之更合理的规则。其优势在于它可以独立于任何具体的硬件或者软件实现。需非常小心地使用浮点运算,因为浮点运算只有有限的范围和精度,而且不遵循普遍的算数属性,比如结合性。