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


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

    教材学习内容总结

    书上内容:

    p20: 三种数字:无符号数(表示大于或等于零的数)、有符号数(2进制补码)、浮点数——当计算结果太大超出了计算机的表示范围时,就会产生溢出(overflow)

    p22: 进制转换,十六进制(0x或0X开头)、十进制、二进制之间的相互转换——注意拿二进制作中间结果就好转了

    p25: gcc -m32 可以在64位机上(比如实验楼的环境)生成32位的代码

    p26: 字节顺序是网络编程的基础,小端法:“高对高、低对低”, 大端法与之相反。

    p28: 代码执行:

    p32: 能区分逻辑运算(结果是1或0)和位运算(结果是位向量),所有逻辑运算都可以用与、或、非表达(最大式、最小式),而与或非可以用“与非”或“或非”表达,所以,只要一个与非门,就可以完成所有的逻辑运算。

    与——&&
    或——||
    非——!
    按位与——&
    按位或——|
    按位异或——^
    按位取反——~
    逻辑右移(算数右移)——>> +右移位
    逻辑左移(算数左移)——<< +左移位
    

    p33: 掩码是位运算的重要应用,对特定位可以置一,可以清零

    p38: 要用C99中的“long long”类型,编译是要用 gcc -std=c99

    p39: 补码的利用寄存器的长度是固定的特性简化数学运算。想想钟表,12-1 等价于 12 + 11,利用补码可以把数学运算统一成加法,只要一个加法器就可以实现所有的数学运算。

    p44: 注意C语言中有符号数和无符号数的转换规则,位向量不变。想想第一章说的 信息就是“位+上下文”

    p48: 怎么样让负数等于正数? 信息安全的逆向思维:

    程序运行的结果为正数变负,负数变正,0保持不变:

    p49: 0扩展和符号扩展

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

    p52: 深入思考一下代码和结果

    ·运行这个代码:

    ·出现错误:

    ·出现这个错误的原因是代码有错,应该将b=sum_element(a[10],0)改为b=sum_element(a,0),代码运行结果如下:

    ·结果应该为0但是程序运行出来的结果为1,这是因为参数length是无符号的,计算0-1进行的是无符号运算,结果得到Umax,比较使用的是无符号数进行比较,任何数小于Umax,因此比较结果为真。
    ·改正方法:将length改成int型或者for循环测试条件改为i<length:

    p54: 如何让整数运算溢出?如何避免? p62例子看看

    p67: 关于整数运算的最后思考:表示数字的有限字长限制了可能的值的取值范围,结果运算可能溢出。同时C 语言中的某些规定(比如unsigned数据类型),可能是产生某些难以察觉的缺陷的源头,比如书上p52的代码运行结果与预期不符,需要在以后的使用中多加注意。

    p67: 浮点数有科学计数法的基础就不难理解,IEEE标准754

    p68: 浮点数运算的不精确性与舍入

    p70: IEEE浮点标准,float/double类型

    IEE浮点标准: V=(-1)^s X 2^E X M 来表示一个数
    符号:s决定这个数是正数还是负数(0的符号位特殊处理)  
    尾数:M是一个二进制小数,范围为1~2-ε或者0~1-ε(ε=1/2的n次幂)
    阶码:E对浮点数加权,这个权重是2的E次幂(可能为负)
    

    p74: 整数与浮点数表示同一个数字的关系

    p78: 整数与浮点数转换规则

    int转换为float——数字不会溢出但可能会舍入
    int或float转换成double——double有更大的范围和精度所以可保留精确的数值
    double转为float——可能溢出也可能舍入
    float或double转为int——值会向零舍入且可能溢出
    整数不确定值——浮点数转换为整数但是不能为该浮点数找到一个合理的整数近似值
    

    代码调试中的问题和解决过程

    问题1:在运行书上p28页的代码出现:对“main”未定义的错误:

    解决过程1:经过查看代码发现书上给出的代码中没有主函数“main”,自行加上主函数后则可以运行:

    课后作业中的问题和解决过程

    习题2.11

    代码;

    运行结果:

    代码调整以后的结果:

    习题2.23

    代码:

    运行结果:

    结果分析:fun1进行的是逻辑移位,fun2进行的是算数移位

    本周代码托管截图——代码托管链接

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

    这一周学习的内容在于数据在计算机内的表示,包括数据的类型和不同类型间的转换以及数据的运算等,虽然知识比较琐碎也比较多,但是可以和我们之前所学过的C语言课程所结合在一起进行学习。大体上看来都是一些比较基础性的东西,不是特别难懂,但是这些内容是以后进行编程实践的基础,同样需要重视和掌握。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 4000行 20篇 400小时
    第0周 0/0 1/1 5/5
    第1周 0/0 1/2 10/15
    第2周 300/300 1/3 15/30
    第3周 200/500 1/4 10/40

    参考资料

  • 相关阅读:
    USACO提交方法
    洛谷 P1967 【货车运输】
    一本通 P1386 【打击犯罪】
    洛谷 P5767 【最优乘车】
    洛谷 P5658 【括号树】
    洛谷 P5657 【格雷码】
    洛谷 P2272 【最大半连通子图】
    二分图匈牙利算法
    最小生成树Kruskal算法
    觉得写出了抽象类和接口,以及概括了设计模式的宗旨
  • 原文地址:https://www.cnblogs.com/20145223ymy/p/5927501.html
Copyright © 2020-2023  润新知