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

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

    教材学习内容总结

    三种数字表示

    无符号:编码基于传统的二进制表示法,表示大于或等于0的数字。

    补码:编码表示有符号整数的最常见的方式,有符号整数就是可以为正或者为负的数字。

    浮点数:编码是表示实数的科学记数法的以二为基数的版本。

    漏洞原因:因为3种数字精度有限所以计算机会因溢出而使用求模运算,使无限的明文对应有限的密文,因此会出现漏洞。

    进制转换

    在计算机导论课程中已掌握。

    用gcc –m32可以在64位机上生成32位代码:

    寻址和字节顺序

    小端法:在存储器中按照从最低有效字节到最高有效字节的顺序存储对象,"高对高,低对低"。

    大端法:在存储器中按照从最高有效字节到最低有效字节的顺序存储。"高对低,低对高"。

    布尔代数

    在离散数学中已掌握。

    掩码

    我们能通过指定一个位向量掩码,有选择地使能或是不能屏蔽一些信号,其中某一位位置上为1时,表明信号i是有效的,而0表明该信号是屏蔽的。因此,这个掩码表示的就是设置为有效信号的集合。掩码运算通常是通过位级运算来实现的。

    逻辑运算和位级运算

    C语言中提供了一组逻辑运算符||、&&和!,分别对应于命题逻辑中的OR、AND和NOT运算。逻辑运算很容易和位级运算相混淆,但是它们的功能是完全不同的·。逻辑运算认为所有非零的参数都表示TRUE,而参数0表示FALSE。它们返回1或者0,分别表示结果为TRUE或者FALSE。

    按位运算只有在特殊情况下,也就是参数被限制为0或者1时,才和·与其对应的逻辑运算有相同的行为。

    逻辑运算符&&和||与它们对应的位级运算&和|之间第二个重要的区别是,如果对第一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值。

    移位运算

    C语言还提供了一组移位运算,以便向左或向右移动位模式。移位运算可以从左向右结合的,所以x<<j<<k等价于(x<<j)<<k。

    一般而言,机器支持两种形式的右移:逻辑右移和算数右移。逻辑右移在最左端补k个0,算数右移在最左端补k各最高有效位的值。

    C语言标准没有明确定义应该使用哪种类型的右移。对于无符号数据,右移必须是逻辑的。对于有符号数据,算数的或者逻辑的右移都可以。

    使用C99标准编译long long类型

    C源文件代码:

    编译及运行命令:

    C语言中有符号数和无符号数的转换

    位向量不变,只是上下文的读取方式不同,所以根据不同的读取规则,最终的读取结果也不同。这就是所谓的信息就是位+上下文。

    注:c语言中要创建一个无符号常量,必须加上后缀字符'U'或者'u'。

    转换的原则是底层的位表示保持不变。

    怎么让负数等于正数

    将有符号负数转化为无符号正数,变的只是上下文的读取方式,但二进制位级表示是一样的。

    零扩展和符号扩展

    零扩展:将一个无符号数转换为一个更大的数据类型,我们只需要简单地在开头添加0。

    符号扩展:将一个补码数字转换为一个更大的数据类型,规则是在表示中添加最高有效位的值的副本。

    无符号数与有符号数容易造成的错误

    例:以下一段代码:

    float sum_elements(float a[],unsigned length){

    int i;
    
    float result=0;
    
    for(i=0;i<=length-1;i++)
    
        result+=a[i];
    
    return result;
    

    }

    因为参数length是无符号的,计算0-1将进行无符号运算,这等价于模数加法。结果得到UMax。<=比较进行同样使用无符号数比较,而因为任何数都是小于或者等于UMax的,所以这个比较总是为真!因此,代码将试图访问数组a的非法元素。

    1. 改正方法:将length声明为int类型。
    2. 或将for循环的测试条件改为i<length。

    整数溢出

    整数溢出:指完整的整数结果不能放到数据类型限制的字长中去。

    避免整数溢出:当两个整数进行运算时,其结果用更大的数据类型进行存储。比如两个int类型的整数相乘的结果用long long数据类型的变量来存储。

    关于整数运算的思考

    计算机执行的"整数"运算实际上是一种模运算形式。表示数字的有限字长限制了可能的值的取值范围,结果运算可能溢出。

    补码提供了一种既能表示负数也能表示正数的灵活方法,同时使用了与执行无符号算数相同的位级实现,这些运算包括加减乘除,无论是以无符号形式还是以补码形式表示的,都有完全一样或者非常类似的位级行为。

    浮点数

    浮点表示对形如V=x*的有理数进行编码。它对涉及非常大的数字(| V|>>0)、非常接近于0(|V|<<1)的数字,以及更普遍地作为实数运算的近似值的计算,是很有用的。

    浮点数的运算及执行标准:IEEE标准754。

    浮点数运算的不精确性和舍入

    当一个数字不能精确地表示为IEEE标准754时,就必须向上或者向下调整,此时出现舍入。

    IEEE浮点标准,float和double类型

    单精度浮点格式(float)中,s、exp和frac字段分别为1位、k=8位和n=23位,得到一个32位的表示。

    双精度浮点格式(double)中,s、exp和frac字段分别为1位、k=11位和n=52位,得到一个64位的表示。

    整数与浮点数转换规则

    当在int、float和double格式之间进行强制类型转换时,程序改变数值和位模式的原则如下(假设int是32位的):

    从int转换成float,数字不会溢出,但是可能被舍入。 从int或float转换成double,因为double有更大的范围(也就是可表示值的范围),也有更高的精度(也就是有效位数),所以能够保留精确的数值。 从double转换成float,因为范围要小一些,所以值可能溢出为+∞或-∞。另外由于精确度较小,它还可能被舍入。 从float或者double转换为int,值将会向零舍入。

    教材学习中的问题和解决过程

    在运行perl语言文件是遇到如下错误:

    查阅百度后得知解决方案:

    Linux下perl文件的执行

    #! /usr/bin/perl

    第一个"#"表示是这一行是注释

    第二个"!"表示这一行不是普通注释,而是解释器路径的声明行

    解释器的路径可以通过locate perl找到。

    例子:

    #!/usr/bin/perl

    #test.pl

    print "test message! ";

    然后,给文件加上可执行的属性:

    $ chmod 755 test.pl

    或者

    $ chmod +x test.pl

    这两个命令用哪一个都可以,现在执行:

    $ ./test.pl

    本周代码托管截图

    代码链接:https://git.oschina.net/929210354/Linux

    其他

          这周的学习内容和数学学科的相关度比较大,很多概念很抽象,难以理解,所以我花费了大量时间做练习题,感觉自己对

    信息的表示和处理有了更加深入的理解。

    学习进度条

     代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
    目标 5000行 30篇 400小时  
    第一周 0/0 1/2 20/30 学习了一些Linux核心命令
    第二周 250/250 1/3 20/50 学习了vim编辑器基础
    第三周 280/530 1/4 18/68 熟练在vim里编程并运行

    参考资料

  • 相关阅读:
    Realtime crowdsourcing
    maven 常用插件汇总
    fctix
    sencha extjs4 command tools sdk
    首次吃了一颗带奶糖味的消炎药,不知道管用不
    spring mvc3 example
    ubuntu ati driver DO NOT INSTALL recommand driver
    yet another js editor on windows support extjs
    how to use springsource tools suite maven3 on command
    ocr service
  • 原文地址:https://www.cnblogs.com/dwc929210354/p/5928163.html
Copyright © 2011-2022 走看看