2017-2018-1 20155314 《信息安全系统设计基础》第3周学习总结
2017-2018-1 20155314 《信息安全系统设计基础》第3周学习总结
教材学习内容总结
学习目标
- 理解二进制在计算机中的重要地位
- 掌握布尔运算在C语言中的应用
- 理解有符号整数、无符号整数、浮点数的表示
- 理解补码的重要性
- 能避免C语言中溢出,数据类型转换中的陷阱和可能会导致的漏洞
- 进一步理解“信息=位+上下文”
教材内容提炼
第2章 信息的表示和处理
- 三种最重要的数字表示
- 无符号编码:表示大于或等于零的数字
- 补码编码:表示有符号整数的最常见方式
- 浮点数编码:表示实数的科学记数法的以2为基数的版本
- 信息存储
- 虚拟内存:机器级程序将内存视为一个非常大的字节数组,称为虚拟内存
- 十六进制表示法
- 字数据大小
- 一个字长为w位的机器,虚拟地址的范围为0~2w-1,程序最多访问2w个字节
- 向后兼容:大多数64位机器也可以运行为32位机器编译的程序
- ISO C99引入一类数据类型,其数据大小是固定的,不随编译器和机器设置而变化
- int32_t:4字节
- int64_t:8字节
- 对关键字的顺序以及包括还是省略可选关键字来说,C语言允许存在多种形式:如
unsigned long
、unsigned long int
、long unsigned
、long unsigned int
均等价
- 寻址和字节顺序
- 小端法:最低有效字节在最前面
- 大端法:最高有效字节在最前面
- 表示字符串
- 表示代码
- 布尔代数简介
- 布尔环中加法运算是,每个元素的加法逆元都是它自己本身,即对于任何值a,**aa=0**
- C语言中的位级运算(按位布尔运算)
- |
- &
- ~
- ^
- C语言中的逻辑运算(逻辑运算认为所有非零的参数都表示TRUE(返回1),而参数0表示FALSE(返回0))
- ||
- &&
- !
- C语言中的移位运算
- 左移
- 右移
- 逻辑右移:在左端补k个0
- 算术右移:在左端补k个最高有效位的值
- 整数表示
- 整型数据类型
- 无符号数的编码
- 补码编码
- 有符号数和无符号数之间的转换
- C语言中的有符号数与无符号数
- 扩展一个数字的位表示
- 截断数字
- 关于有符号数与无符号数的建议
- 整数运算
- 无符号加法
- 补码加法
- 补码的非
- 无符号乘法
- 补码乘法
- 乘以常数
- 除以2的幂
- 关于整数运算的最后思考
- 浮点数
- 二进制小数
- IEEE浮点表示
- 数字示例
- 舍入
- 浮点运算
- C语言中的浮点数
- 从
int
转成float
:数字不会溢出,但可能被舍入 - 从
int
或float
转成double
:能保留精确的数值 - 从
double
转成float
:值可能溢出成+∞或-∞,还可能被舍入 - 从
float
或double
转成int
:值将会向零舍入
- 从
课后实践:myod
实践要求
-
复习c文件处理内容
-
编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
-
main与其他分开,制作静态库和动态库
-
编写Makefile
-
提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
-
在博客园发表一篇博客,重点写遇到的问题和解决过程
我的代码
#include<stdio.h>
#include<stdlib.h>
void myod(char *f);
int main(int argc,char *argv[]){
myod(argv[1]);
return 0;
}
void myod(char *f){
FILE *fp;
char ch;
char str[16];
int i=0,j,count=0;
if((fp=fopen(f,"r"))==NULL){
printf("ERROR!\n");
exit(0);
}
while((ch=fgetc(fp))!=EOF){
str[i]=ch;
i++;
if(i==16){
i=0;
printf("%07o ",count);
for(j=0;j<16;j++){
if(str[j]=='\n') printf("\\n ");
else printf("%-4c",str[j]);
count++;
}
printf("\n");
printf(" ");
for(j=0;j<16;j++)
printf("%02x ",str[j]);
printf("\n");
}
}
printf("%07o ",count);
for(j=0;j<i;j++){
if(str[j]=='\n') printf("\\n ");
else printf("%-4c",str[j]);
count++;
}
printf("\n");
printf(" ");
for(j=0;j<i;j++)
printf("%02x ",str[j]);
printf("\n");
printf("%07o ",count);
printf("\n");
fclose(fp);
}
运行截图
教材学习中的问题和解决过程
- 问题1:什么是GCC?
- GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。
- 问题2:什么是汇编和反汇编?
- 汇编(Assembly):把汇编语言翻译成机器语言的过程
- 反汇编(Disassembly):把目标代码转为汇编代码的过程
- 问题3:什么是GUI?
- 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
代码调试中的问题和解决过程
- 问题1:
git add .
时报错:fatal: Not a git repository (or any of the parent directories)
- 解决方案:这是由于本地版本管理仓库被删除了,需要用
git init
命令重新初始化仓库,建立新的仓库:
- 问题2:
git push
时报错:fatal: The current branch master has no upstream branch.
- 解决方案:利用
git push -u origin master -f
命令强制覆盖已有的分支后再push,push成功:
代码托管
上周考试错题总结
结对及互评
本周结对学习情况
- 20155323
- 结对学习内容
- 教材第1章 计算机系统漫游
其他(感悟、思考等,可选)
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:5小时
-
实际学习时间:2小时