2017-2018-1 20155207 《信息安全系统设计基础》第3周学习总结
教材学习内容总结
第二章 信息的表示和处理
- 2.1 信息存储
- 虚拟存储器:计算机级程序将存储器视为一个非常大的字节数组
- 地址:存储器每个字节的唯一数字标识
- 虚拟地址空间:所有可能地址集合
- 程序对象:程序数据、指令和控制信息
- 2.1.1 十六进制表示法
- 以
0X
或0x
开头的数字常量常被认定为十六进制的值 - 十进制->十六进制:反复地用16除x,余数从最低位开始计
- 以
- 2.1.2 字
- 字长:指明整数和整数和指针数据的标称大小
- 字长决定虚拟空间的虚拟地址空间的最大大小,字长为w的机器,虚拟地址范围为0~2^w-1
- 2.1.3 数据大小
- 2.1.4 寻址和字节顺序
- 小端法:最低有效字节在最前面的的方式
- 大端法:最高有效字节在最前面的方式
- 双端法:可配置
- 强制类型转换:允许一种数据类型引用一个对象,而这种数据类型与创建这个对象时定义的数据类型不同
- 2.1.5 表示字符串
- 文本数据比二进制数据具有更强的平台独立性
- 2.1.6 表示代码
- 二进制代码是不兼容的
- 2.1.7 布尔代数简介
- 布尔代数:将逻辑值TRUE和FALSE编码为二进制0和1,设计出的一种研究逻辑推理基本原则的代数
~
对应于NOT,&
对应于AND,|
对应于OR,^
对应于异或- 有限集合可以用位向量来编码
- 2.1.8 C语言中的位级运算
- C语言支持按位布尔运算
- 确定一个位级表达式的结果最好的方法,就是将十六进制的参数扩展成二进制表示并执行二进制运算,然后再转换成十六进制
- 掩码:表示从一个字中选出的位的集合
- 2.1.9 C语言中的逻辑运算
- 逻辑运算符:
||
、&&
、!
分别对应命题中的OR、AND、NOT,与位级运算不同 - 移位:
<<
向左移动右边补零,>>
无符号数右数是逻辑右移,有符号数算数或者逻辑右移都可以
- 逻辑运算符:
- 2.2 整数表示
- 2.2.1 整型数据类型
- int可以用2字节实现,long4字节,long long至少8字节
- 2.2.2 无符号数的编码
- 无符号的二进制数,每个介于0~2^w-1之间的数都有唯一一个w位的值编码
- 2.2.3 补码编码
- 将字的最高有效位解释为负权
- 补码的范围不对称:|TMin|=|TMax|+1
- UMax(w)=2TMax(w)+1
- 2.2.4 有符号数和无符号数之间的转换
- 处理同样字长有符号数和无符号数之间的互相转换:数据可能会变,但是位模式不变
- 2.2.5 C语言中的有符号数与无符号数
- 要创建一个无符号常量,必须加上后缀
U
或u
- 显式强制转换,隐式一种类型的表达式被赋值给另外一种类型的变量
%d
有符号十进制%u
无符号十进制%x
十六进制- 一个运算数是有符号数一个运算数是无符号数,C语言隐式的将有符号参数强制类型转换成无符号数,并设这两个数都是非负的
- 要创建一个无符号常量,必须加上后缀
- 2.2.6 扩展一个数字的位表示
- 零扩展:无符号数
- 符号扩展:有符号数
- short转换成usigned时,先转换大小,转换成int,再变成无符号数
- 2.2.7 截断数字
- 将一个w位的数截断为一个k位数字时,我们会丢弃高w-k位,等于计算x mod2^k
- 2.2.8 关于有符号数和无符号数的建议
- Java不支持无符号数,正常右移
>>
执行算数右移,特殊运算符>>>
执行逻辑右移 - 想把数仅看作是位的集合,没有任何数字意义 ,无符号数是有意义的
- Java不支持无符号数,正常右移
- 2.2.1 整型数据类型
- 2.3 整数
- 2.3.1 无符号数加法
- 无符号计算可以看作一种模形式的运算
- 无符号加法等价于计算和模2^w
- 溢出:完整的整数结果不能放到数据类型的字长限制中去
- 当且仅当s<w,发生了溢出,溢出则s=x+y-2^w
- 阿贝尔群:模数加法形成的一种数学结构
- 2.3.2 补码加法
- 负溢出,加2^w
- 正溢出,减2^w
- 2.3.3 补码的非
- 除-2^(w-1)的补码为本身之外,其他补码都为-x
- 2.3.4 无符号乘法
- 等价于计算乘积模2^w
- 2.3.5 补码乘法
- 和无符号乘法运算的位级相同
- 2.3.6 乘以常数
x<k
相当于x*2^k mod2^wx<<k
相当于x*2^K
- 2.3.7 除以2的幂
x>k
对于非负数与逻辑右移一样- 对于无符号变量
x>>k
相当于x/2^k
- 2.3.8 关于整数运算的最后思考
- 2.3.1 无符号数加法
- 2.4 浮点数
- 对形如V=x*2^y的有理数进行编码
- IEEE标准754
- 2.4.1 二进制小数
- 只是近似的表示,并不精确
- 2.4.2 IEEE浮点表示
- IEEE浮点标准用V=(-1)s*M*2E的形式表示一个数
- 符号:s决定这个数是负数(s=1)还是正数(s=0),对数值0的符号位解释作为特殊情况处理
- 尾数:M是一个二进制小数,范围是12-e或01-e
- 阶码:E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)
- 单精度浮点格式,s、exp、frac字段分别为1位、k=8、n=23,32位表示
- 双精度浮点格式,s、exp、frac字段分别为1位、k=11、n=52,64位表示
- 根据exp的值,被编码的值可以分成三种不同情况
- 规格化的值:exp的位模式既不全为0,也不全为1(单精度255,双精度2047)
- 非规格化的值:阶码域为全0
- 特殊值:阶码全为1
- 2.4.3 数字示例
- 2.4.4 舍入
- 向偶数舍入方式:将数字向上或者向下舍入,使得结果的最低有效数字是偶数
- 向零舍入方式:把正数向下舍入,把负数向上舍入
- 向下舍入方式:把正数负数都向下舍入
- 向上舍入方式:把正数负数都向上舍入
- 2.4.5 浮点运算
- 2.4.6 C语言中的浮点数
- int转换成float,数字不被溢出,但是可能被舍入
- int/float转换成double,能保留精确数值
- double转换成float,值可能被溢出,还可能被舍入
- float/double转换成int,值将会向零舍入
教材学习中的问题和解决过程
- 问题1:我在33页看了这一段文字
尽管浮点型和整型数据都是对数值12345编码,但是他们有截然不同的字节模式:整型为0x00003039,而浮点数为0x4640E400.
- 问题1解决方案
不是很懂为什么编码12345的浮点数是0x4640E400。 我查了百度,说浮点数使用IEEE754标准,然后我去百度查找IEEE754标准的格式,并使用蓝墨云班课中的IEEE计算器问题就解决了。
代码调试中的问题和解决过程
- 问题1:教材31页代码没有不能运行
- 问题1解决方案:编译之后才发现是由于没有主函数导致的,我自己编写了一个简单的主函数运行
代码托管
上周考试错题总结
打不开错题
结对及互评
点评模板:
- 博客中值得学习的或问题:
- xxx
- xxx
- ...
- 代码中值得学习的或问题:
- xxx
- xxx
- ...
- 其他
本周结对学习情况
- [20155223](http://www.cnblogs.com/battlefieldheros/p/7629031.html)
- 结对照片
- 结对学习内容
教材第二章和实验楼实验三内容
其他(感悟、思考等,可选)
这周是十一放假回来的第一周,放假期间我没有针对课程之前学过的知识进行复习,导致这周在学习过程中有点吃力,因为之前的知识有些生疏了,我想既然我们的教学资源有很多都放在网上,无论是否放假都应该及时复习。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 1/3 | 18/38 | |
第三周 | 500/1000 | 1/4 | 22/60 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:10小时
-
实际学习时间:7小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)