20145204《信息安全系统设计基础》第3周学习总结
教材学习内容
-
存储方式。 在计算机中,多字节对象一般被存储为连续的字节序列,对象的地址为字节中最小的地址。但是存储方式有“小端法”(低有效字节存储在低地址),“大端法”之分。
-
位级运算:&(位与),|(位或),~(位非),^(异或)。
-按位与 &
1、清零特定位 (将特定位置0,其它位为1)
2、取某数中指定位 (将中特定位置1,其它位为0)
-按位或 |
常用来将源操作数某些位置1,其它位不变
-按位异或
1、使特定位的值取反 (特定位置1,其它位为0 )
2、把一个数全部位置0. -
有符号数和无符号数的转换 。在c语言中同样字长的有符号数和无符号数之间相互转换一般是数值可能会改变。在运算过程中,当一个有符号数和一个无符号数运算时,会隐式的将有符号数转换为无符号数。有时候隐式的转换可能对计算结果产生错误。
-
扩展一个数字的位,即在不同字长的整数间转换,数值保持不变。有零扩展和符号扩展两种。零扩展:将一个无符号数转换为更大的数据类型,只需在开头填零即可。符号扩展:将一个有符号数转换为更大的数据类型,添加最高有效位值的副本。
-
浮点数:标准:IEEE标准754
十进制:小数点左边的数字的权是10的非负幂,得到整数值;右边的数字的权是10的负幂,得到小数值。
二进制:小数点左边的数字的权是2的非负幂,右边的数字的权是2的负幂。 -
IEEE浮点表示。用V = (-1)s * M * 2E的形式来表示一个数:
符号:s决定这个数是负数(s = 1)还是正数(s = 0),而对于数值0的符号位解释作为特殊情况处理。
尾数:M是一个二进制小数,它的范围是1 ~ 2-ε,或者是0 ~ 1-ε。
阶码:E的作用是对浮点数据加权,这个权重是2的E次幂(可能是负数)。
学习中遇到的问题与解决方法
- p24例: show_bytes:(添加main函数),在main函数中只定义了一个int型的值,强制转换成不同数据观察输出字节。
void main()
{
int val=0x87654321;
show_int(val);
show_float((float)val);
show_pointer(&val);
}
显示结果:
从结果中可以看出:整数型和浮点型的输出字节数据不一样。在我的linux系统上是使用小端法存储数据,电脑是64位地址。
- p35例: reverse_array函数调试解决:
1.当输入的数是偶数时程序正常输出。
2.输入奇数时中间的数字变为0,单步调试:循环了3次,最后一次循环结束后a[2]变为0。
3.查看最后一次循环的first和last值,first=2=last.又因为inplace_swap()
函数是异或得到的两个数字交换,所以在最后循环结束时,a[2]=0。
4.解决这个问题的办法是:输入奇数时控制循环条件变为first<last
。下图是结果:
- p44例: 代码初始
int v=-12345
,有符号数和无符号数相互转换,数值不一样,输出字节序列一样。
- p49例显示结果:无符号数的扩展高位添加0,有符号扩展添加最高位的数字。数值大小不变。
- 关于gdb的单步执行:
在调试家庭作业2.64中,发现(gdb)n之后产看数据的值,数据没有发生变化,但是在再一次(gdb)n之后数据才会按照上一条命令发生相应的变化。一开始一直以为是我的计算有问题,后来才发现n只是写出下一个命令,但是未执行。图为结果:初始值x为12,在出现x^=x>>1
命令时,p x的值是上一条命令的结果。
家庭作业
2.61:
写一个表达式,在下列的条件下产生1,其他情况下得到0.
分析:该题要求对一个数字写出一个表达式,最后结果有两种:1或者0。此时我们应该想到数的逻辑运算,加以位运算得到结果。
A.x的任何位都等于1. !(~x)。
B.x的任何位都等于0. !x
C x的最高有效字节中的位都等于1. !(~(x>>((sizeof(int)-1)<<3)))
D.x的最低有效字节中的位都等于0. !(x&0xff)
2.64:实现思路:在verilog奇偶校验数据时实现的方法是各位进行“异或”操作,然后将结果与1相与。因此我们可以简单的实现:
int even(unsigned x)
{
x^=x>>16;
x^=x>>8;
x^=x>>4;
x^=x>>2;
x^=x>>1;
return !(x&1);
}
在c中对于32位的数字以折半异或的方式实现以减少运算次数。结果如下图:
![](http://images2015.cnblogs.com/blog/886770/201609/886770-20160928165225922-874307287.png)
##托管代码
[代码链接](https://git.oschina.net/yaya5204/linux)。
##学习进度条
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
| -------- | :----------------:|:----------------:|:---------------: |:-----:|
| 目标 | 3500行 | 30篇 | 400小时 | |
| 第一周 | 100/100 | 1/1 | 20/20 | |
| 第二周 | 200/300 | 1/2 | 30/50 | |
| 第二周 | 100/400 | 1/3 | 28/78 | |
## 参考资料
- [Linux基础入门](https://www.shiyanlou.com/courses/1)
- [Linux下C语言开发基础](https://www.shiyanlou.com/courses/running)
- ...