20155325 2017-2018-1 《信息安全系统设计基础》第三周学习总结
知识点
补码相加:转化为补码之后,所有位相加
教材学习中的问题和解决过程
- 问题1:“浮点数编码是表示实数的科学计数法的以2为基数的版本。”什么是科学计数法
- 解决:科学记数法的形式是由两个数的乘积组成的。表示为a×10^b(aEb)
其中一个因数为a(1≤|a|<10),另一个因数为10^n。 - 问题2:练习题2.11
修改代码,实现数组元素对调
void inplace_swap(int *x,int *y)
{
*y = *x^*y;/*step1*/
*x = *x^*y;/*step2*/
*y = *x^*y;/*step3*/
}
void reverse_array(int a[],int cnt)
{
int first,last;
for(first=0,last=cnt-1;first<=last;first++,last--)
inplace_swap(&a[first],&a[last]);
}
这段代码,当数组个数为偶数时能够成功,但是个数为奇数的时候,中间的那个被置为零。
对于置零情况我的想法是:
因为x*x=0,所以当first==last相当于传inplace_swap(&a[first],&a[first]);
step1:x = x^x;-->x=0;
step2:x = 0^0;-->x=0;
step3:x = 0^0;-->x=0;
所以我当时的结论是相同值计算时结果都会被置为0,但是我实验了一下{1,2,3,1}这种对称位相同的数据,发现并不会置零。于是出现矛盾。于是我开始怀疑我的推算原理是否错误。
- 解决:经过反复推算,我认为置零的情况推导没有问题,如果不是这样,其他成功结果的运算推导会出现矛盾。所以我还是询问了大佬。大佬说虽然他们的值一样,但其实传过去的东西并不一样。我当时陷入我得出的结论,仍似懂非懂。后来一个风和日丽的下午我重新在纸上演算了一遍:
因为0^x=x且x=y;
step1:*y=0;
step2:x=x^0;-->x=x
step3:y=x^0;-->y=x
之前一直拿*x代替 *y,所以……虽然之前也知道是传的地址,改的地址对应的内容……
- 问题3:练习题2.14
x、y的字节值分别为0x66和0x39要求计算各个C表达式的字节值。
字节值?喵喵喵?
一个字节值转换成多少个二进制位来着……哭笑不得
-
解决:搜字节值会出现字节的搜索结果,所以……
咳咳,1个字节=2个16进制字符=8个2进制字符。
-
问题4:P41“位移指令只考虑位移量的低log2 (w)位,因此实际上位移量就是通过计算k mod w得到的的。”表示并不能理解。
-
解决:P67“将一个无符号数截断为w位等价于计算该值模2^w”。同时查对数公式log a(a^n) = n。然后就发现是一样的道理了。
-
问题4:P52
int x = -1;
unsgned u = 2147483648;
printf("x = %u = %d\n",x,u);
printf("u = %u = %d\n",u,u);
32位电脑结果为:
x = 4292967295 = -1;
u = 2147483648 = -2147483648;
- 解决:
根据自查资料和大佬Z的解惑
(4294967295)10 = (1111 1111 1111 1111 1111 1111 1111 1111)2
无符号整数转换为有符号整数 :
看无符号数的最高位是否为1,如果不为1(为0),则有符号数就直接等于无符号数;如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。
1111 1111 1111 1111 1111 1111 1111 1111-->最高位是1(则为负数)-->补码1000 0000 0000 0000 0000 0000 0000 0001-->int -1
(1000 0000 0000 0000 0000 0000 0000 0000)2 = (2147483648)10
无符号整数转换为有符号整数 :
看无符号数的最高位是否为1,如果不为1(为0),则有符号数就直接等于无符号数;如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。
无符号:1000 0000 0000 0000 0000 0000 0000 0000-->最高位是1-->补码:1000 0000 0000 0000 0000 0000 0000 0000-->int -2147483648
参考链接:
无符号整数转换
理解有符号数和无符号数负数
- 问题5:P58 2.25
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,会出现内存错误,我不明白。
-
解决:看了答案后似懂非懂内心不踏实。查了查Umax结果出现了电影院(???)当时搜索资料无果,然后,是的我又找了大佬D确认内心的想法……
结论:0-1的结果在不同的地方结果也是不同的,比如在32位机器上,得到的是32个1(二进制)。
根据P53页“如果它的一个运算数是有符号的而另一个是无符号的,那么C语言会隐式地将有符号参数强制类型转换为无符号数,并假设这两个数都是非负的,来执行运算。”
所以i会被当做一个无符号数来++,而当length==0,“0-1”位最大的无符号数(Umax),所以“i<=length-1”总成立,无限循环。
代码调试中的问题和解决过程
在看书做题的时候边敲代码边弄了,直接都放到上面了。
代码托管
上周考试错题总结
上一周的题第二次做全对。
其他
对于我来说,我觉得自学起第二章有些困难。各种数转换绕老绕去,公式难懂,让本来数学就不好的我更是瑟瑟发抖内心拒绝,不过根据实验楼上的要求,可以去做做题,反而觉得根据题目去摸索比看懂公式简单2333
还是希望老师能在上课的时候多讲一点关于书本的内容,上次老师讲了第一章,看起第一章的就容易多了,不会看了书做了题也是心慌慌的不知道自己到底是会还是不会。
有时候自己在思考不出的时候容易陷入某个思维的僵局,仿佛查到任何资料都好似看不懂了一般,然后就去寻找各种大佬的帮助(捂脸,臣妾做不到了),经过大佬们的提点,可能当时还是似懂非懂,不过在经历了一段时间重新去思考就能一下子跳开思维的僵局解开谜团……醍醐灌顶,茅塞顿开。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 16篇 | 400小时 | |
第一周 | 9/9 | 1/1 | 19/19 | 熟练下载安装技能,锻炼解决问题能力 |
第2周 | 380/389 | 2/3 | 26/45 | 1、7章 |
第3,4周 | 1270/1659 | 3/6 | 42 | 2、10章 |