zoukankan      html  css  js  c++  java
  • 信息安全系统设计基础第四周学习总结

    第四周(9.28-10.04):

    学习计时:共xxx小时

    读书:

    代码:

    作业:

    博客:

    一、学习目标

    1. 理解二进制在计算机中的重要地位
    2. 掌握布尔运算在C语言中的应用
    3. 理解有符号整数、无符号整数、浮点数的表示
    4. 理解补码的重要性
    5. 能避免C语言中溢出,数据类型转换中的陷阱和可能会导致的漏洞
     

    二、学习资源

    (提示:可选项,如有其他相关资源请在此说明):

    1. 教材:第二章《信息的表示和处理》,详细学习指导见

    2. 课程资料:https://www.shiyanlou.com/courses/413   实验三,课程邀请码:W7FQKW4Y

    3. 教材中代码运行、思考一下,读代码的学习方法见

     

    三、学习方法

    (提示:为提高学生的学习效果,请在此处为学生提出微课程学习的具体要求或建议)

     

    1.  进度很重要:必须跟上每周的进度,阅读,练习,问答,项目。我会认真对待每一位同学,请你不要因为困难半途而废。

    2. 问答很重要:遇到知识难点请多多提问,这是你的权利更是您对自己负责的义务。问答到博客园讨论小组:http://group.cnblogs.com/103791/
    3. 实践很重要:解决书中习题,实践书中实例,完成每周项目,才算真的消化了这本好书。通过实验楼环境或自己安装的虚拟机在实践中进行学习
    4. 实验报告很重要:详细记录你完成项目任务的思路,获得老师点评和帮助自己复习。学习完成后在博客园中(http://www.cnblogs.com/)把学习过程通过博客发表,博客标题“信息安全系统设计基础第三周学习总结”

    四、学习任务

    (提示:请将要求学生完成的任务、测验或思考题列在此处)

    1. 阅读教材,完成课后练习(书中有参考答案)

    2. 考核:练习题把数据变换一下

    3. 加分题:课后作业最多两人一组,互相不能重复,1星题目每人最多加一分,2星题目每人最多加二分,3星题目每人最多加三分,4星题目每人最多加四分。

     

    、后续学习预告(可选):

    教材第三章《程序的机器级表示》

    、学习过程

    (提示:此处由学生填写,学习过程,学习笔记,代码编译,运行结果,思考等)

     

    信息的表示和处理

    1、数字的三种表示

    无符号数:传统的二进制表示法,表示大于或等于零的数字
    补码:表示有符号数,可为正可为负的数字
    浮点数:实数的科学计数法的以二为基数的版本
    整数运算和浮点数运算会有不同的数学属性。
    原因:处理数字表示有限性的方式不同
    整数表示:编码的数值范围相对较小,但精确 
    浮点数表示:编码的数值范围相对较大,但是近似的
    计算机运算的漏洞多由于计算机算数运算的微秒细节引发的

    2、进制转化

    (1)x=2^n转化为十六进制

    将x写成x=2^n的形式,令n=i+4j,x的十六进制表示为:开头为2^i的值,后面补j个0。

    (2)十进制转化为十六进制

    十进制数x反复除以16,得十六进制数

    (3)十六进制转化为十进制

    十六进制数x反复乘以16,得十进制数

    3、字和字节顺序

    字长:一个字长指明整数和指针数据的标称大小。字长决定最重要的系统参数就是虚拟地址空间的最大大小。对一个字长为w位的机器而言,虚拟地址的范围是0~2^w-1,程序最多访问2^w个字节。 
    对于跨越多字节的程序对象需建立两个规则: 
    这个对象的地址是什么,以及在存储器中如何排列这些字节。 
    小端法:高对高,低对低 
    大端法:从视觉上,是这次阅读的顺序,与小端法相反。 使字节顺序变得可见的三种方式: 不同类型的机器之间通过网络传送二进制数据时,网络应用程序的代码编写必须遵守已建立的关于字节顺序的规则;使用反汇编器,处理整数数据的字节序列的存储字节顺序问题;当编写规避正常的类型系统的程序时。

    4、布尔代数

    (1)位向量的运算:按位运算

    (2)位向量的应用:表示有限集合

    掩码表示的是设置为有效信号的集合。

    (3)位级运算

    |:或 
    &:与 
    ~:取反 
    ^:异或 
    确定一个位级表达式的结果的最好的方法就是:将十六进制的参数扩展成二进制表示并执行二进制运算,然后在转换为十六进制。 w 位级运算的常用算法:掩码运算。 
    掩码运算:掩码是一个位模式,表示从一个字中选出的位的集合。例如:位级运算x&0xFF生成一个有x的最低有效字节组成的值。表达式~0将生成一个全1的掩码,不管机器的字大小是多少。

    (4)逻辑运算

    逻辑运算符:||(或)、&&(与)、!(非) 
    逻辑运算认为所有非零的参数都表示TRUE,参数0表示FALSE。返回1或者0,分别表示结果为TRUE或FALSE。 
    逻辑运算和位级运算的区别是: 
    按位运算只有在特殊情况下,即参数被限制为0或者1时,才能与其对应的逻辑运算有相同的行为; 若第一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值。

    (5)移位运算

    左移k位:丢弃最高位的k位,右端补k个0 
    右移包括:逻辑右移算数右移 
    逻辑右移:左端补k个0(常用于无符号数) 
    算数右移:左端补k个最高有效位的值(用于有符号数)

    5、补码编码

    补码形式是最常见的有符号数的计算机表示方式 
    将字的最高有效位解释为负权 B2T(W)函数为:B2T(x) = -x(w-1)2^(w-1)+∑xi2^i(求和从i=0到i=w-2)

    6、有符号数和无符号数之间的转换

    处理同样字长的有符号数和无符号数之间相互转换的一般规则:数值可能会改变,但是位模式不变。 
    c语言允许无符号数和有符号数之间的转换。转换的原则是底层的位表示不变。 
    当从无符号数转换为有符号数是,效果是应用函数U2T,从有符号数转化为无符号数时,应用函数T2U,其中w表示数据类型的位数。
    负数和正数相等的情况:u=2147483648 =-2147483648 
    (当输出分别为无符号形式和有符号形式时)

    7、扩展数的位表示

    零扩展:将无符号数转换为更大的数在表示的开头添加0 
    符号扩展:将一个补码数字转换为一个更大的数据类型

    8、截断数字

    截断数字:不用额外的位来扩展一个数值,而是减少表示一个数字的位数。

    注意!!补码经过截断处理后的结果仍是补码,注意结果为负数时转化为十进制数

    9、使用无符号数的情况

    (1)把字仅仅看做是位的集合,并没有任何数字意义时
    (2)当实现模运算和多精度运算的数学包时,数字是由数的数组来表示的,无符号值也会非常有用。

    10、整数运算

    (1)无符号加法

    无符号运算可以被视为一种模运算形式,无符号加法等同于计算和摸上2^w,可以通过简单的丢弃x+y的w+1位表示的最高位,来计算这个数值。 
    一个算数运算的溢出,是指完整的整数结果不能放到数据类型的字长限制中去。

    (2)补码加法

    两个数的w位补码之和与无符号之和有完全相同的位级表示。大多数计算机用相同的机器指令来执行无符号或者有符号加法。 
    有符号加法的结果z=x+y可分为4种情况: 
    (1)-2^(w)≤z<-2^(w-1):两个负数相加得一个非负的结果。 
    (2)-2^(w-1)≤z<0:结果正常,z为负数 
    (3)0≤z<2^(w-1):结果正常,z为正数 (4)2^(w-1)≤z<2^(w):两个正数相加得一个负数的结果。

    (3)补码的非

    对于范围-2^(w-1)≤x<-2^(w-1)内的x,补码的非运算如下:
    (1)x=-2^(w-1):补码的非为-2^(w-1); (2)x>-2^(w-1):补码的非为-x。 
    求位级补码非的方法: 
    (1)对每一位求补,再对结果加1;(2)建立在将位向量分为两部分的基础之上的。

    (4)无符号乘法

    两个数x、y相乘且x、y的位数为w,则结果的位数为2w。

    (5)补码乘法

    同无符号乘法。 若为截断后的结果,则取结果的后w位作为计算结果。
    注意:无符号运算和补码运算在“+”、“-”、“*”在位级上有相同的结果。

    (6)乘以常数

    对于某个常数K的表达式x*K生成代码,编译器会将K的二进制表示表达为一组0或1的交替的序列: [(0…0)(1…1)(0…0)…(1…1)] 
    可以用以下两种形式来计算这些乘积的结果: 
    A:(x<<n)+(x<<n-1)+……+(x<<m) 
    B:(x<<n+1)-(x<<m)

    注意:对于n为最高位的情况,B:-(x<<m)

    注意!!(x<<0)的结果是x,而不是0

    (7)除以2的幂

    设x/K,令K=2^n,
    当x为正数时,计算 x>>n
    当x为负数时,将x加上偏置量,即加上2^n-1(即K-1),计算** (x+偏置量)>>n**。

    (8)关于整数运算的最后思考

    计算机执行的“整数”运算实际上是一种模运算形式; 
    表示数字的有限字长限制来了可能的值的取值范围,运算结果可能溢出;
    补码表示提供了一种即能表示负数也能表示正数的灵活方法,同时使用了与执行无符号算术相同的位级实现; 
    c语言中的unsigned数据类型的使用也应当特别注意,比如,在书写整数常数和调用库函数的时候。

    11、浮点数

    (1)二进制小数

    将十进制小数转换为二进制小数 
    首先,将十进制小数写成分数的形式,将分数的分子部分,写成二进制的形式;将分数的分母部分写成2^n的形式,将分子的二进制形式,从右往左数,数n位添加小数点。
    小数点左移:除以2 
    小数点右移:乘以2

    (2)IEEE浮点数表示

    表示形式为:V = (-1)^s * M * 2^E 
    符号:s决定这个数是负数(s = 1)还是正数(s = 0),而对于数值0的符号位解释作为特殊情况处理。 
    尾数:M是一个二进制小数,它的范围是1 ~ 2-ε,或者是0 ~ 1-ε。 
    阶码:E的作用是对浮点数据加权,这个权重是2的E次幂(可能是负数)。 
    根据阶码的值,可分为一下三种情况: 
    情况一:规格化的值 (当阶码字段不全为0或全为1时)
    E = e-Bias
    Bias = 2^(k-1)-1 
    M = 1+f 
    情况二:非规格化的值 (当阶码字段全为0时)
    E = 1-Bias
    Bias = 2^(k-1)-1 
    M = f
    情况三:特殊值 (当阶码字段全为1时)
    当小数域全为0时, 当s=1时,为-∞;当s=0时,为+∞。
    当小数域不全为0时,为NaN。

    (3)浮点数的舍入

    有四种情况分别是:向偶数舍入(默认)、向零舍入、向下舍入、向上舍入。

    (4)浮点运算

    浮点加法:不满足结合性、满足单调性 
    浮点乘法:不满足结合性、满足单调性,在加法上不满足分配性

     

    七、遇到的问题及解决

    (提示:此处由学生填写,是重要的得分点,要写出遇到的问题和解决方案以及对出现问题的思考)

    遇到的问题

    1、对课本练习题2.11中B的解释还是不太理解。
    2、对课本练习题2.14中的前3个空不理解,我的答案和正确答案是相反的,比如答案是0x20,我的是0x02。 
    3、截断数字部分不是很理解,希望老师可以讲解一下。 
    4、课本练习题2.27算法不懂,为什么不能是s=x+y,判断s是否等于x+y?是因为计算机计算x+y的。 5、对课本2.42的答案代码不太理解。 
    6、课本P71中说,对于单精度来说,指数的取值范围为-126~127,为什么是这个范围,-126是怎么来的? 
    7、对浮点数舍入规则中的向偶数舍入的规则不太理解。
    8、课本练习2.52中怎么由A格式舍入到B格式的,遵循什么规则?不能理解答案。

     

     

     

     

    八、其他

    (提示:此处由学生填写,灵感,领悟等)

     

  • 相关阅读:
    laravel5.2 开发中打印sql语句
    centos 安装 vsftpd
    linux 安装 DenyHosts 防止密码被暴力破解
    linux nginx 安装防火墙ngx_lua_waf
    mysql 下载资源地址
    微信公众号 access_token 没有过期 却失效
    centos 安装 composer
    五十个小技巧提高PHP执行效率
    yii 使用DB实现rbac 权限控制
    git 的使用
  • 原文地址:https://www.cnblogs.com/java-stx/p/4846688.html
Copyright © 2011-2022 走看看