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


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

    教材学习内容总结

    信息存储

    • 字节是最小的可寻址的存储器单位。
    • 机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器
    • 存储器的每个字节都能由唯一的数字来标识,称为地址
    • 十六进制表示法:若位的总数不是4的倍数,最左边的一组可以少于4位,前面用0补足。
    • 字长指明整数和指针数据的标称大小。
    • 虚拟地址空间的大小由字长决定,字长决定的最重要的系统参数就是虚拟地址空间的最大大小。对于一个字长为w位的机器而言,虚拟地址的范围为0-2w-1,程序最多访问2w个字节。
    • 程序可移植性的一方面是使程序对不同数据类型的确切大小不敏感。
    • 对于跨越多字节的程序对象,必须建立两个规则:(1)对象的地址是什么(2)在存储器中这些字节如何排列。
    • 最低有效字节在最前面的方式称为小端法,最高有效字节在最前面的方式称为大端法。
    • 字节顺序可见的三种情况:(1)网络应用程序代码编写时必须遵循已建立的关于字节顺序的规则;(2)由反汇编器生成(反汇编器是确定可执行文件所表示的指令序列的工具);(3)编写规避正常的类型系统的程序时,可以使用强制类型转换来允许一种数据类型引用一个对象。
    • 布尔代数是研究逻辑推理的基本原则,通过布尔代数进行集合运算可以获取到不同集合之间的交集、并集或补集,进行逻辑运算可以对不同集合进行与、或、非。
    • 位向量应用于表示有限集合。
    • 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]。

    整数表示

    • 无符号数的编码:假设一个整数数据类型有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浮点表示

    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标准定义了一些使之更合理的规则。其优势在于它可以独立于任何具体的硬件或者软件实现。

    • 需非常小心地使用浮点运算,因为浮点运算只有有限的范围和精度,而且不遵循普遍的算数属性,比如结合性。

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

    这一章很多知识是之前的一些课程里接触过的,但没有真正的运用到编程中,很多时候程序出现溢出、强制转换出错等问题都无法解决,深入了解这些知识后,希望能之后的编程中能解决这类问题。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 0/0 2/2 10/10
    第二周 30/30 1/3 7/17
    第三周 0/30 1/4 5/22
    第四周 0/30 0/4 0/0

    参考资料

  • 相关阅读:
    分模块开发创建service子模块——(八)
    分模块开发创建dao子模块——(七)
    分模块开发创建父工程——(六)
    Html设置html与body元素高度问题
    原生JS给元素添加class属性
    【雪花点】雪花点的显示——(二)
    【雪花点】雪花点的显示——(一)
    Dom4j用Xpath获取节点——(六)
    Dom4j向XML中指定位置添加、删除、修改节点——(五)
    [置顶] 详细解读:技术有没有前途之分
  • 原文地址:https://www.cnblogs.com/LLLLLLQL/p/5919194.html
Copyright © 2020-2023  润新知