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

学习任务: 
1.二进制在计算机中的重要地位:
二进制值是计算机编码、存储和操作信息的核心。
2.布尔运算在C语言中的应用
c语言支持按位布尔运算,这些运算可以运用到任何整型的数据类型上。
确定一个位级表达式的结果的最好方法是 将十六进制的参数扩展成二进制表示并执行二进制运算,然后再转换回十六进制。
3.有符号整数、无符号整数、浮点数的表示
有符号整数表示:
有符号数是针对二进制来讲的。用最高位作为符号位,"0"代表"+","1"代表"-";其余数位用作数值位,代表数值。

有符号数的表示:计算机中的数据用二进制表示,数的符号也只能用0/1表示。一般用最高有效位(MSB)来表示数的符号,正数用0表示,负数用1表示。

有符号数的编码方式,常用的是补码,另外还有原码和反码等。用不同二进制编码方式表示有符号数时,所得到的机器数可能不一样,但是真值应该是相同的。

例题:

 
 
 
 
无符号整数表示:

无符号数是针对二进制来讲的,无符号数的表数范围是非负数。

全部二进制均代表数值,没有符号位。即第一个"0"或"1"不表示正负

 
例题:
 
 
 
有符号数和无符号数之间的转换:
信息安全系统设计基础第三周学习总结_第1张图片
总结
无符号数转换为有符号数
看无符号数的最高位是否为1,如果不为1(即为0),则有符号数就直接等于无符号数;如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。
有符号数转换为无符号数
看有符号数的最高位是否为1,如果不为1(即为0),则无符号数就直接等于有符号数;如果有符号数的最高位为1,则将有符号数取补码,得到的数就是无符号数。
C语言中有符号数和无符号数:
信息安全系统设计基础第三周学习总结_第2张图片
 
总结

C支持所有整形数据类型的有符号数和无符号数运算。尽管C标准并没有指定某种有符号数的表示,但是几乎所有的机器都使用二进制补码。通常,大多数数字默认都使有符号的,C也允许无符号数和有符号数之间的转换,转换原则是基本的位表示保持不变。当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C会隐含地将有符号参数强制转换为无符号数,并假设这两个数都是非负的,来执行这个运算。

浮点数表示:
信息安全系统设计基础第三周学习总结_第3张图片
IEEE表示浮点数
信息安全系统设计基础第三周学习总结_第4张图片
 
C语音中浮点数的表示:
 

float:单精度,32位

unsigned float:单精度无符号,32位

double:双精度,64位

long double:高双精度,80位

 
 
4.理解补码的重要性
 
5.能避免C语言中溢出,数据类型转换中的陷阱和可能会导致的漏洞
信息安全系统设计基础第三周学习总结_第5张图片
 
重点练习

1.p24 进制转换代码 

 
1 #!/bin/perl
2  #  Convert list of decimal numbers into hex
3  
4  for($i=0;$i<@ARGV;$i++){
5            printf("%d\t=0x%x\n",$ARGV[$i],$ARGV[$i]);
6  }

 

 
#!/bin/perl
# Convert list of hex numbers into decimal

for($i=0;$i<@ARGV;@i++){
 $val = hex($ARGV[$i]);
 printf("0x%x=%d\n",$val,$val);
}

 

 

2.p24 show_bytes,写个main函数测试一下,参考p30代码

信息安全系统设计基础第三周学习总结_第6张图片

主函数:

 信息安全系统设计基础第三周学习总结_第7张图片

运行结果:

信息安全系统设计基础第三周学习总结_第8张图片

3.p35 练习2.11, 可以用GDB单步跟踪一下,理解更深刻

信息安全系统设计基础第三周学习总结_第9张图片

信息安全系统设计基础第三周学习总结_第10张图片

答案:

问题A:k,k

问题B:假设k=2,,2k+1=5,当达到最后一次循环的时候,first=last=2,a[2]=3. 此时调用函数inplace_swap,在该函数内部得到:

     第一步:y=3^3=0

     第二步:x=3^0=3

     第三步:y=x^y=3^0=3

这是我们希望的结果,但是在实际上2.10采用了指针的方式。当第一步y=3^3=0时,指针y所指向的地址存储的值已经改变,同时x也指向了与y相同的地址,所以此时x=0。因此后面两步没有意义。事实上结果如下:

     第一步:y=3^3=0,x=0

     第二步:x=0^0=0,y=0

     第三步:y=x^y=0^0=0,x=0

 

问题C:解决方法有两种。

其一可以将for(first = 0, last = cnt - 1;first <= last;first ++, last --)改为for(first = 0, last = cnt -1;first <last;first ++, last --)
其二可以讲inplace_swap函数中的指针xy改为普通变量。

 

4.p44 代码放到一个main函数中,可以用GDB单步跟踪一下,理解更深刻

 信息安全系统设计基础第三周学习总结_第11张图片

信息安全系统设计基础第三周学习总结_第12张图片

gdb调试:

信息安全系统设计基础第三周学习总结_第13张图片

信息安全系统设计基础第三周学习总结_第14张图片

5.p47/p49代码放到一个main函数中,可以用GDB单步跟踪一下,理解更深刻

信息安全系统设计基础第三周学习总结_第15张图片

gdb:

信息安全系统设计基础第三周学习总结_第16张图片

6.p78,转换规则可以写几行代码测试一下。

分别测试了以下几种情况:

int->float

int->double

double->float

double->int

信息安全系统设计基础第三周学习总结_第17张图片

信息安全系统设计基础第三周学习总结_第18张图片

 

 

 

教材家庭作业

 

信息安全系统设计基础第三周学习总结_第19张图片

代码:

信息安全系统设计基础第三周学习总结_第20张图片

运行结果:

信息安全系统设计基础第三周学习总结_第21张图片

 

出现的问题及解决方法:

1.因为不了解perl语言,不知道怎样运行,最后自己尝试编写了一份c语言的进制转换,能够成功出现结果。

2.由于实验楼没有加入用户组,出现“没有权限。。。”,加入后可正常操作。

3.gdb无法单步跟踪,总是提示the program is not being run。设置断点后后用run命令也无法停到断点处。在网上查阅后,多少人说是由于gdb自身的问题,需要重新安装。

4.在做最后的家庭作业的时候,出现与题意相反结果,如图:

信息安全系统设计基础第三周学习总结_第22张图片

经过检测,是函数的返回值出现了问题,取了相反值,改正后可正确输出。

 

你可能感兴趣的:(信息安全系统设计基础第三周学习总结)