2018-2019-1 20165226 《信息安全系统设计基础》第2周学习总结
目录
教材学习内容总结
**** ### 一、信息存储 1、字数据大小 > ①程序适用机器类型: >> `gcc -m32 prog.c`可在32位或者64位机器上正确运行 >> `gcc -m64 prog.c`只能在64位机器上运行 > > ②声明指针: >> 对于任何数据类型T,声明:`T*p`,表明p是一个指针变量,指向一个类型为T的对象。 >> 例如:`char *p`就将一个指针声明为指向一个char类型的对象。2、字节顺序
①小大端:
小端法:最低有效字节在最前面的方式
大端法:最高有效字节在最前面的方式②表示整数数据的字节序列时字节顺序(遇小端则将字节按相反方向显示)
4004d3: 01 05 43 0b 20 00 add %eax,0x200b43(%rip)
3、位级运算
确定位级表达式:将十六进制的参数扩展成二进制表示并执行二进制运算,然后再转换回十六进制。
4、移位运算
操作 | 值 |
---|---|
参数x | [01100011][10010101] |
x<<4 | [00110000][01010000] |
x>>4(逻辑右移) | [00000110][00001001] |
x>>4(算数右移) | [00000110][11111001] |
斜体数字表示的是最右端(左移)或最左端(右移)填充的值,但算术运算,拿右移来说,操作数最高位是1,则填充值为1
二、整数表示
1、无符号数的编码
原理
无符号数编码的定义
无符号数编码的唯一性
示例
2、补码的编码
原理
- 补码编码的定义
- 补码编码的唯一性
运行程序及结果
反码除了最高有效位的权是
-(2^(w-1)-1)
而不是-2^(w-1)
3、无符号数与有符号数转换
- 显式:
int tx,ty;
unsigned ux,uy;
tx=(int) ux;
uy-(unsigned) ty;
- 隐式
int tx,ty;
unsigned ux,uy;
tx= ux;
uy= ty;
- 举例(t2u为例)
#include <stdio.h>
int main()
{
char t = 0xFF;
unsigned char u = (unsigned char)t;
//%d把对应的整数按有符号十进制输出,%u把对应的整数按无符号十进制输出
printf("t=%d,t2u=%u
",t,u);
return 0;//c标准规定建议main函数返回值为int
}
4、截断
- 截断无符号数:x'=xmod(2^k) 截断k位
- 截断补码数值:x'=U2(T_k)(xmod2^k)
三、整数运算
1、无符号数加法
用x和y为例,将整数和
x+y
截断为w位的结果作为一个无符号数输出正常:x+y
溢出:x+y-MAX
无符号数求反(结果如下)
x, x=0
2^w-x, x>0
2、补码加法
x+y-MAX, 正溢出
x+y, 正常
x+y+MAX, 负溢出
3、补码的非
TMin
-x,x>TMin
4、无符号乘法:
x*y=(x·y)mod(2^w)
5、补码乘法:
x*y=U2T((x·y)mod(2^w))
无符号和补码乘法的位级等价性:T2B(xy)=U2B((x'y')
6、乘以常数
乘以2的幂:x2^k的w+k位表示:后面增加k个0
与2的幂相乘的无符号乘法&补码乘法:x<<k
7、除以2的幂
无符号除法:x>>k
补码除法(向下舍入):算术右移k位
补码除法(向上舍入):(x+(1<<k)-1)>>k
四、浮点数
1、IEEE浮点表示:V = (-1)^s * M * 2^E
整数值和单精度浮点值在危机表示上有如下关系:相关的区域对应于整数的低位,刚好在等于1的最高有效位之前停止(这个位就是隐含的1),和浮点表示的小数部分的高位是相匹配的。
舍入:找到最接近x的匹配值x'。向偶数舍入/向最接近的值舍入(默认)
向零舍入(正数向下、负数向上)|x'|<=|x|
向下舍入
向上舍入
2、浮点运算
加法不具有结合性
乘法不具有分配性
C语言中的浮点数运算int->float 数字不会溢出,但是可能被舍入
int/float->double 能保留精确的数值
float/double->int 值将会向零舍入
教材学习中的问题和解决过程
****- 问题1: 怎么样让负数等于正数?
- 问题1解决方案:可以通过将有符号数转换成无符号数。
- 问题2:如何让整数运算溢出?如何避免?
- 问题2解决方案:
整数溢出:若
2^(w+1)> x+y ≥ 2^w
,则表示溢出
- ps:若是无符号数,对于c = a + b,如果c < a || c < b 则已经溢出了
避免:①通过检测,若溢出将该合数减去2^w
②找一个较大值进行模运算
代码学习中的问题和解决过程
****- 问题1:
gcc 编译出错
- 问题1解决办法:
通过提示,发现将
-o
误写成了-0
,更改后成功运行。
- 问题2:
报错: too many arguments for format
- 问题2解决方案:
开始以为是要打印的内容太多了,即引号内部的打印顺序有问题,调整后再编译还是出现了warning,就直接运行看看结果,发现是打印格式出错,如下图:
误将%d
写成了&d
,更改后运行成功
代码托管与统计
**** [代码托管](https://gitee.com/Sean-Lxs/5226lxs.git) ![](https://img2018.cnblogs.com/blog/1047870/201809/1047870-20180930094709421-1949249370.png)教材2.96
**** ### 题目如下: ![](https://img2018.cnblogs.com/blog/1047870/201809/1047870-20180930095518777-1434296501.jpg)知识点分析
1、浮点数通常表示
其中,M(Mantissa)被称为浮点数的尾数 ,R(Radix)被称为阶码的基数 ,E(Exponent)被称为阶的*** 阶码 ***。
2、浮点数规格化表示
尾数用原码;阶码用“移码”;基为2)
下面举一个32位单精度浮点数-3.75表示的例子帮助理解:
运行结果
代码(https://gitee.com/Sean-Lxs/5226lxs.git)
上周错题总结
**** 1、(多选题) > 用gcc hello.c -o hello 编译hello.c,hello中不存在()节 > A ..debug B ..text C ..line D ..rodata ![](https://img2018.cnblogs.com/blog/1047870/201809/1047870-20180930102329721-1459235261.png) > > 正确答案: A C 你的答案: A > 解析:gcc -g 才会出现.debug .line2、( 单选题 | 1 分)
dll,so文件的链接是运行在()
A .编译时 B .加载时 C .运行时 D .链接时正确答案: C 你的答案: A
解析:动态链接库在运行时加载
学习进度条
****代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 87/87 | 2/2 | 20/20 | |
第二周 | 71/158 | 1/3 | 12/32 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:10小时
-
实际学习时间:12小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)