《信息安全系统设计基础》第三周问题总结
总结了一下52、53班78名同学第三周博客的问题,对我自己本身的学习也有很大的帮助,从好的同学那里找到好的学习方法以及解决问题的办法,可以看到同学们都遇到了哪些问题以及怎么解决的。
其中有不少重复的问题,我只总结了一次,主要集中在24页代码perl脚本怎样运行这个问题上,卢肖明给出的博客大家可以参考()
还有28页代码运行出现问题大家提问的也比较多,要添加main函数,这个不少同学已经意识到并且已经成功运行了。
1、问题:p48怎么样让负数等于正数?
5201的解答:由练习题2.21在负数x后加上U,可以使其转换为(2^w+x)- 问题:Perl语言的代码到底是如何编译运行的?
5207的解答:我在网上查的是:
第一步,创建XXX.pl并编辑
第二步,perl XXX.pl
第三步,运行./XXX.pl
但是我用这种方法敲了P24的代码:
开始的报错是因为“i++”前面少了“$”。
提示没有权限,我百度了之后说是用 chmod +x XXX.pl 解决,然后再次运行,显示没有文件目录,是因为我按照书上打上去的,把它改成#!/home/shiyanlou,但是还是权限不够。不清楚它到底是怎么运行起来的...
5207同学可以看一下后面总结的5208同学的问题,他也遇到了同样的问题并且成功地解决了。
5207同学也可以看一下5215同学的发布的小组话题:
2、问题:不理解什么叫“数值可能改变,但是位模式不变。”
老师的解答:“数值可能改变,但是位模式不变” 就是“信息=位+上下文”的很好的诠释。 比如 以4位为例, 无符号二进制数 "1001" 是九, 转为有符号数,还是“1001”,只是最高位变成负号了,是-71、问题:P24页perl文件运行问题
5208的解答:第一次写perl脚本,运行上面出了不少问题,先是找不到文件
网上查到说要改第一行目录,于是搜索自己的系统中perl解释器的安装目录进行替换 后来提示解释器权限不够,用chmod修改了权限也还是一样,但是搜索了一些perl文件执行的样例,尝试了一下加上perl再执行,成功:2、P28页代码问题
问题:编译的时候出现如下错误
5208的解答:经查找错误类型发现是函数构造的问题,可以构造一个main函数解决。
然而输出结果如下,应该是没有赋值x的原因: 赋值后结果如下:3、p35 练习2.11
问题:在运行的时候发现奇数个的时候中间数值会是0,偶数正常
5208的解答:调试发现由于在最后一次调用inplace_swap的时候,赋值给first和last变量的都是原数组中最中间的数字,所以在第一处*y = x^y时,y指向的数字就变为了0,此后,0作为最中间数字进入循环。
只要把first<=last 改为first<last就可以解决了:
1.问题:整数与浮点数转换规则是什么?
5209的解答:整数->浮点数:整数转换成二进制表示,然后小数点左移若干位得到规格化表示;取出小数部分的数值,在后面补0使其达到23位; 用frac加上偏置量得到的结果用二进制表示,放在取出的部分前面,再加上一个符号位即可。
2.怎样让负数等于正数?
5209的解答:在负数x后加上U,可以使其转换为(2^w+x)
问题:P28页代码不全,需要我们自己编译一个main函数
5210的解答:
代码运行结果:1.问题:从逆向角度考虑为什么无符号数、有符号数(2进制补码)、浮点数之间的转换会产生漏洞?
5212的解答:任何漏洞产生都必然因为系统不可更改的局限性——>无符号数、有符号数、浮点数的局限性——>无符号数或者有符号数的表示范围有限,而浮点数虽然编码范围大,但是不精确。 2.问题:怎么样让负数等于正数? 5212的解答:在负数x后加上U,可以使其转换为(2^w+x) 3.问题:整数与浮点数表示同一个数字的关系? 5212的解答:整数与浮点数表示同一个数字时,化成二进制形式之后,可以看到,整数等于1 的最高有效位之后的数字,与浮点数小数部分的高位是相匹配的 4.当阶码全为1、小数域全为0时,得到的值表示无穷;当阶码全为1、小数域不全为0时,结果是NaN(not a number) 5.问题:整数与浮点数转换规则? 5212的解答:整数->浮点数:整数转换成二进制表示,然后小数点左移若干位得到规格化表示;取出小数部分的数值,在后面补0使其达到23位; 用frac加上偏置量得到的结果用二进制表示,放在取出的部分前面,再加上一个符号位即可。1、问题:练习题2.11
加上main函数后执行,发现数组长度为奇数时,中间的元素会被置为0
5214的解答:由于在最后一次调用inplace_swap的时候,y指向的数字就变为了0。解决办法只需要将reverse_array函数的循环条件中的first<=last 改为first<last(最中间的数字不会参与循环)即可。
注意修改过后需要再次编译才能显示正确的结果!
2、问题:练习题2.25
按照原代码会出现错误
5214的解答:改正代码的方法:一是将length声明为int类型;二是将for循环的测试条件改为 i < length3、问题:练习题2.42
测试代码时结果出现错误
进入vi检查代码,查不出明显的错误
目前尚未解决问题
问题:什么是强制类型转换结果保持位值不变,只改变解释这些位的方法?
5217的解决:比如,将float f强制转换成int f float f=5.75;printf("(int)f=%d,f=%f\n",(int)f,f);f虽强制转为int型,但只在运算中起作用,是临时的,而f本身的类型并不改变。因此,(int)f的值为 5(删去了小数)而f的值仍为5.75。问题:在运行书上p28页的代码出现:对“main”未定义的错误:
5223解决过程:经过查看代码发现书上给出的代码中没有主函数“main”,自行加上主函数后则可以运行:
问题:p28页代码一开始编译的时候出现问题,显示对main未定义的引用
5227的解决:自己添加了一个主函数解决了问题。1、问题:在测试强制转换的代码时,编译没有通过。
5231的解答:结果发现是在定义数据类型时将byte_pointer误写成bytes_pointer,不太清楚警告出现的原因。
2、问题:在课后作业中慢慢弄懂了逻辑移位和算术移位的区别,一开始对于整数和浮点数的转换不是太清楚,后面通过看了书上示例:整数写成二进制形式,再表示成科学计数法形式,阶码字段:指数加上127 小数字段:丢弃开头,末位加0,凑齐23位 ,不太理解阶码这个概念,以前也没接触过...
我的解答:在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫做阶码,阶码指明了小数点在数据中的位置。问题:运行书P28代码,添加了主函数
代码托管遇到:fetch-first问题!
5232的解决:它的意思是说本地和服务器上的代码冲突了,类似svn上的,所以需要先pull,再push。(可能是我之前已经提交过一次了)
先 git pull origin master
再 git push origin master 代码托管问题:在第35页的代码我也发现了一个问题,按照课后习题的答案我将中间的<=改成<就可以解决这个问题,是因为没必要交换正中间的元素和他自己,所以会出现那个错误,但是我只说输入n位,但是在执行的时候却要输入n+1位,计算的时候依旧是前n位,这是为什么?
5233的解决:通过修改代码我发现,我发现是因为通过循环实现,所以是需要来一步步比较的,修改了其中的比较次数就会出现在结果显示的时候不全的问题。
问题:p74 2.48 虽然表示的是同一个值,但表示在十六进制上并不相同
5301的解答:因为要表示浮点数,数被分为两部分:整数部分和小数部分。例如,浮点数3510593.0就有整数部分3510593和小数部分0.0.首先把浮点数转换成二进制数,步骤如下:1把整数部分转换成二进制.2把小数部分转换成二进制.3在两部分之间加上小数点.浮点数还可以规范化,浮点数可以用单精度表示法和双精度表示法.规范化只存储这个数的三个部分的信息:符号,指教和尾数。
1、问题:代码编译遇到错误:关于未声明的错误
解决:发现之前没有定义过bytes_pointer,定义的是byte_pointer;程序代码开头定义常量MAX,后面代码随手写Max。太粗心了,修改过后即可编译成功
2、问题:编译通过后,运行文件时,总是找不到目录或文件
解决:通过不断的进行尝试比较,我发现根源出在我的main函数这里,在代码中我一直将main函数的函数名写为文件名,这是C语言,我有些搞混了,我将main函数的函数名改回main,并再次进行编译、运行的工作,终于成功了。问题:逻辑运算符与位运算符的区别
5308的解答:1.首先逻辑运算与位级运算符号上就不同,逻辑运算为||、&&、!,位级预算符是|、& 2.逻辑运算认为所有非零参数都是TRUE,也就是!!0x41=0x01 3.逻辑运算符如果对第一个参数求值就能确定表达式结果就不会对第二个参数求值 问题:p47 u输出的第二个结果为什么为-2147483648 5308的解答:无符号数到有符号十进制数的转换过程中u的数值已经超过了有符号数正数的最大值,输出为负问题:在用gdb单步执行p35的代码时,莫名跳过了第一个scanf,导致进入for循环无法退出。
解决:先用c命令运行至下一断点,再用quit跳出循环。问题:p52的代码运行修改和思考
首先随便设置一个数组a,然后计算第0个累加之和,就出现了存储器错误5319的解答:在思考之后,在不修改函数的情况下,令传入参数length的值为1,仍旧出现了存储器错误
于是开始猜测错误的原因所在,length的定义为unsigned length为无符号数,而在函数中却出现了length-1,当length=0时,该值即为负数,但无符号数中无法表示负数,便对此进行修改,将i<=length-1修改为i<length
得到正确值0.0
之后继续查询,明白原因,因为参数length是无符号的,计算0-1将进行无符号运算,这等价于模数加法。结果等于UMax。所以这个比较总是真的,因此代码试图访问数组a的非法元素。P44关于有无符号数之间转换
强制类型转换的结果保持位值不变,只是改变解释的方式
可以看到16位补码的-12345与53191的16位无符号表示一样。32位无符号4294967295和-1的补码形式一样。
1、练习2.52 对最后一项格式A二进制[000 0001]表示成格式B,即将非规格化的转为规格化的浮点数表示有没有具体的方法步骤
解决过程 对于规格化转为规格化,我总结成为两种情况:没有产生整数的进位,产生了整数的进位。但非规格化的转为规格化的浮点数中的接码到底有何规律可以进行运算的还不确定。对于这道题的非规转规我是这样做的:格式A [000 0001]变为格式B(尾数位数为3,阶码位数为4),对[000 0001]的尾数部分进行舍入,为中间值,所以格式B的尾数为[000],所以转化成的格式B一定是规格化数,值为1x2的几次方;对格式A的阶码部分,1-3=-2,0.0001(b)变为1(b)又需要-4次方,所以该数转换成1,需要 (-2)+(-4)= -6次方,即格式B的阶码为也得为-6,e-7=-6,则e=1,阶码为[0001],即转化成的格式B为[0001 000]
2、练习2.44 第F问,因为补码和无符号加法有相同的位级行为,所以同样两个数的无符号相加和有符号相加是等价的,即是真的
解决过程 那么对“-8”和“8”之类的相同位的该如何判断呢?是只有在比较时,如果有一方式无符号,那么另一方才要转换成无符号吗?等号可以吗?可以的话,这个F问可不可以认为是因为有符号转成了无符号,无符号之间运算的左右结果是等价的? 现在想想这是没有必要有疑惑的,能够以“-8”“8”进行对比,说明“8”为无符号,“-8”为有符号,那么进行比较时,有符号要转换成无符号,即“==”是正确的书p44页关于有符号和无符号数之间相互转换
C语言允许在各种不同的数字数据类型之间做强制类型转换。
起初对于代码段
short int v = -12345unsigned short uv = (unsigned short) v;printf(“v = %d ,uv = %u\n”,v,uv);
理解起来存在一些问题,后来套用到一个主函数中,gcc编译gdb设断点理解就会容易许多。