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 longunsigned long intlong unsignedlong unsigned int均等价
    • 寻址和字节顺序
      • 小端法:最低有效字节在最前面
      • 大端法:最高有效字节在最前面
    • 表示字符串
    • 表示代码
    • 布尔代数简介
      • 布尔环中加法运算是,每个元素的加法逆元都是它自己本身,即对于任何值a,**aa=0**
    • C语言中的位级运算(按位布尔运算)
      • |
      • &
      • ~
      • ^
    • C语言中的逻辑运算(逻辑运算认为所有非零的参数都表示TRUE(返回1),而参数0表示FALSE(返回0))
      • ||
      • &&
      • !
    • C语言中的移位运算
      • 左移
      • 右移
        • 逻辑右移:在左端补k个0
        • 算术右移:在左端补k个最高有效位的值
  • 整数表示
    • 整型数据类型
    • 无符号数的编码
    • 补码编码
    • 有符号数和无符号数之间的转换
    • C语言中的有符号数与无符号数
    • 扩展一个数字的位表示
    • 截断数字
    • 关于有符号数与无符号数的建议
  • 整数运算
    • 无符号加法
    • 补码加法
    • 补码的非
    • 无符号乘法
    • 补码乘法
    • 乘以常数
    • 除以2的幂
    • 关于整数运算的最后思考
  • 浮点数
    • 二进制小数
    • IEEE浮点表示
    • 数字示例
    • 舍入
    • 浮点运算
    • C语言中的浮点数
      • int转成float:数字不会溢出,但可能被舍入
      • intfloat转成double:能保留精确的数值
      • double转成float:值可能溢出成+∞或-∞,还可能被舍入
      • floatdouble转成int:值将会向零舍入

课后实践:myod

实践要求

  1. 复习c文件处理内容

  2. 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能

  3. main与其他分开,制作静态库和动态库

  4. 编写Makefile

  5. 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息

  6. 在博客园发表一篇博客,重点写遇到的问题和解决过程

我的代码

#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小时

参考资料

posted @ 2017-10-15 18:28  20155314刘子健  阅读(220)  评论(0编辑  收藏  举报
Live2D