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 |