20145308 《信息安全系统设计基础》第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.首先逻辑运算与位级运算符号上就不同,逻辑运算为
||
、&&
、!
,位级预算符是|
、&
- 2.逻辑运算认为所有非零参数都是TRUE,也就是!!0x41=0x01
- 3.逻辑运算符如果对第一个参数求值就能确定表达式结果就不会对第二个参数求值
- 1.首先逻辑运算与位级运算符号上就不同,逻辑运算为
- p47 u输出的第二个结果为什么为-2147483648
- 无符号数到有符号十进制数的转换过程中u的数值已经超过了有符号数正数的最大值,输出为负
课后作业中的问题和解决过程
- P79 练习题2.54B为什么为假
- float转换成int,数字不会溢出,但可能被舍入,所以不可以
本周代码托管截图
其他(感悟、思考等,可选)
- 本周主要学习了信息的表示和处理,主要是C语言的数据表示和处理,数据存储和处理这些知识比较抽象,理解比较困难,只有通过例子或者题目才能更好地理解。开始的部分因为有基础还好理解,后面数据的具体处理过程部分就比较难理解了,需要多下功夫。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 1/2 | 25/30 | 学习Linux指令 | |
第二周 | 50/50 | 1/3 | 25/55 | Linux系统下的开发环境 |
第三周 | 20/70 | 1/4 | 25/80 | 信息的表示和处理 |
第四周 | 300/1300 | 2/9 | 30/90 |