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

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

教材学习内容总结

p20: 三种数字:

  • 无符号数:基于传统二进制表示法,表示大于或者等于零的数字。
  • 补码:表示有符号整数的最常见方式
  • 浮点数:表示实数的科学计数法的以二为基数的版本。

p22: 进制转换:注意拿二进制作中间结果。

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

p26: 字节顺序是网络编程的基础。

  • 小端法:高对高,低对低。
  • 大端法:高对低,低对高。

p28: 强制类型转换。自己添加了一个主函数,添加的代码如下:

void test_show_bytes(int val)
{
    int ival = val;
    float fval = (float)ival;
    int *pval = &ival;
    show_int(ival);
    show_float(fval);
    show_pointer(pval);
}
void main()
{
    int val;
    printf("please enter an int:\n");
    scanf("%d",&val);
    test_show_bytes(val);
}

编译及运行结果如下:

p32: 能区分逻辑运算(结果是1或0)和位运算(结果是位向量)

  • 所有逻辑运算都可以用与、或、非表达(最大式、最小式),而与或非可以用“与非”或“或非”表达,所以,只要一个与非门,就可以完成所有的逻辑运算。

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

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

p39: 补码的利用寄存器的长度是固定的特性简化数学运算。

  • 正数的补码=原码
  • 负数的补码=原码各位取反再加1

p44: 有符号数和无符号数的转换

  • 强制类型转换的结果保持位值不变,只是改变了解释这些位的方式。即:这些位上的值不变,但是由于最高有效位的权重发生变化,从而导致结果发生改变。
  • 处理同样字长的有、无符号数之间相互转换的规则:数值可能会变,但是位模式不变。(底层的位表示保持不变)
                 无————>有:U2Tw函数
                 有————>无:T2Uw函数

p48: 怎么样让负数等于正数?

  • 在负数x后加上U,可以使其转换为(2^w+x)

p49: 0扩展和符号扩展

  • 零扩展:多用于无符号数转换为一个更大的数据类型。只需在开头加上0即可。
  • 符号扩展:多用于补码数字转换。最高有效位是什么,就添加什么。

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

  • length=0时会出现存储器错误,这是因为参数length是无符号的,计算0-1将进行无符号运算,等价于模数加法,结果得到UMax。因为任何数都是小于等于UMax的,所以<=比较总是为真,代码将访问数组a的非法元素。
  • 解决办法:1.将length声明为int类型 2.将for循环测试条件改为i>length

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

用V = (-1)s * M * 2E的形式来表示一个数:
符号:s决定这个数是负数(s = 1)还是正数(s = 0),而对于数值0的符号位解释作为特殊情况处理。
尾数:M是一个二进制小数,它的范围是1 ~ 2-ε,或者是0 ~ 1-ε。
阶码:E的作用是对浮点数据加权,这个权重是2的E次幂(可能是负数)。

2.编码规则:

将浮点数的位表示划分为三个字段,分别对这些值进行编码:
一个单独的符号位s直接编码符号s。
k位的阶码字段exp = ek-1…e1e0编码阶码E。
n位小数字段frac = fn-1…f1f0编码尾数M,但是编码出来的值也依赖于阶码字段的值是否等于0。

3.两种常见的格式

C语言中的单精度浮点格式float 和双精度浮点格式double。
在float中,s、exp和frac字段分别为1位、k = 8 位和n = 23位,得到一个32位的表示;
在double中,s、exp和frac字段分别为1位、k = 11 位和n = 52位,得到一个64位的表示。

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

  • 整数->浮点数:整数转换成二进制表示,然后小数点左移若干位得到规格化表示;取出小数部分的数值,在后面补0使其达到23位; 用frac加上偏置量得到的结果用二进制表示,放在取出的部分前面,再加上一个符号位即可。

学习中的问题和解决过程

问题一:p28页代码一开始编译的时候出现问题,显示对main未定义的引用
解决:自己添加了一个主函数解决了问题。

问题二:不是很能理解某些公式,虽然老师说公式可以不看,做习题就好,但是不看公式的话后面练习做起来也很麻烦。但是看了公式效果却不怎么样。

本周代码托管链接

https://git.oschina.net/20145227/IS-Design-20145227

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

  • 听从了老师的建议后,本周注意了代码托管的注释要解释代码的作用,并且完成一个代码之后就git commit了一下。
  • 本周的需要掌握大量的书本内容,不向前面几周做实验一样直观能懂,需要仔细阅读书本,查找相关内容,还要练习习题才能搞清楚。目前还在练习课后习题。关于这章的内容,很多东西都是看起来很熟悉,我们都曾经学习过或者接触过,但是其实做起来并不容易,其中的原理我都是不太清楚的,就算学过的东西也会发现层次和深度都与原先不同。比如IEEE浮点,之前在计算机导论中学习的时候略微知道了一些皮毛,现在应用到实践中会感到比较困难。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0 2/2 20/20
第二周 100/100 1/3 20/40
第三周 200/300 1/4 22/62

参考资料

posted @ 2016-09-30 22:50  20145227鄢曼君  阅读(202)  评论(8编辑  收藏  举报