信息安全系统设计基础第三周学习总结
【学习时间:6 hours】
【学习任务:仔细研读《深入理解计算机系统》第二章内容,掌握整数表示、浮点数表示及其运算】
一、学习过程
1.三种数字:无符号数、有符号数(2进制补码)、浮点数,信息安全系同学从逆向角度考虑为什么会产生漏洞?
整数运算和浮点数运算会有不同的数学属性是因为他们处理数字表现有限性的方式不同。整数的表示虽然只能编码一个较小的范围,但这种表示是精确的;而浮点数表示的范围相对较大,但是这种表示只是近似的。
2.字节顺序是网络编程的基础,两种表示顺序是:小端——“高对高、低对低”,大端与之相反。
3.P28代码如下:
#include <stdio.h>
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len){
int i;
for(i=0;i<len;i++)
printf(" %.2x", start[i]);
printf("
");
}
void show_int(int x){
show_bytes((byte_pointer) &x, sizeof(int));
}
void show_float(float x){
show_bytes((byte_pointer) &x, sizeof(float));
}
void show_pointer(void *x){
show_bytes((byte_pointer) &x, sizeof(void*));
}
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 input the num :");
scanf("%d", &val);
test_show_bytes(val);
}
windows下执行结果如下:
4.命令man ascii可以获得一个ASCII字符码表。
5.使用与非,可以完成交换。
6.技巧:如果要使用C99中的“long long”类型,编译时可以通过 gcc -std=c99完成。
7.有符号数转换成无符号数:B2U(x)=x(w-1)*2^w+x
8.让负数等于正数,使用类型转换,当int型转换为unsigned型时,负数就可以被转换为其二进制表示的无符号数。
9.零扩展:简单地在表示的开头加上0;符号扩展:将一个补码数字转为更大的数据类型,在表示中添加最高有效位的值的副本。
10.P52代码执行,结果如下:
正常:
运行错误:
在lenght=0时,本应该是返回0.0的函数出现了存储器错误。系统提示检测到错误。发现定义的length是unsigned,按照无符号运算的话,结果会是Umax。不等式恒成立。循环就会自动访问a的所有元素直到访问到非法元素。
修改:将length的定义成int即可。
11.如何让整数运算溢出?如何避免?
因为机器有的限制,只要两个运算数进行运算的结果超过Umax或者Umin,就会发生溢出。避免溢出,将运算结果控制在-2^(w-1)---2^(w-1)-1中间;或者增加if语句判断运算数的是否合法。
12.C语言中,有符号数字的乘法是通过将2w位截断为w位的方式来实现的。即:xy - U2T((xy)mod 2 ^w)
13.表达式x*K,其中,K可以表示为一组从位位置n到m连续的1和其他位置的0,那么,表达式可以表示为:
A:(x<<n)+(x<<n-1)+……+(x<<m)
B:(x<<n+1)-(x<<m)
14.浮点数的舍入,转换成分数较易
二、作业总结
1.关于使用与非交换,数组中含有奇数个元素的时候,判断条件中不能有等号,否则会出现中间的数字交换结束后变为0。
2.Java只支持有符号数;Java中,>>是算术右移,>>>是逻辑右移。
3.关于十六进制转化为十进制
例:fffffe58,计算方法 -16^3+1416^2+516+8
4.T2Uw(x)的值y
y+x=2^w
若x=0,则y=0
5.关于练习题2.24
截断,无符号数,截断值直接为模2^3的余数,有符号数余数的值带入 U2Tw(x)中的结果为最后的结果。
U2Tw(x)=y的计算方法:
x<2^(w-1)
y=x
x>=2^(w-1)
y=x-2^w
6.无符号常量,会有后缀字符U或u
7.关于习题2.23
移动24位之后只看最后两位,fun1前面均补0;fun2前两个倒数第二位均小于8,所以前面都补0,后两个数对应位置均大于等于8,所以前面补1。
造成差异的原因:int的位置不同
8.关于2.39,n+1是字长,如果最高有效位只到n的话,则第一项移动字长的位数的结果将变为0。
9.除以2的幂可以通过逻辑(算术)右移实现。
10.关于2.44中举反例时,考虑极端位置,易得到结果。
11.关于2.54中总结:
精度和范围:double>int>float
距参数越近,需要的精度和范围越高。
三、总结
本次学习,一开始看知识点时并不是很清楚,后来经过练习,翻阅答案,从答案中找出规律,从而对公式及解题方法有了更深的了解。