20145305 《信息安全系统设计基础》第3周学习总结

教材学习内容总结

数字表示:

无符号、补码、浮点数

一、信息储存

1.十六进制
C表示法:以0x或0X开头的数字常量为十六进制
二进制、八进制、十进制、十六进制(转换:以二进制作为中间变量)
二进制-十六进制相互转换,二进制的四位数字对应十六进制的一位数字
二进制与八进制的转化是三位对应一位
2.字
虚拟地址是以这样的一个字来编码的
每台计算机都有一个字长,指明整数和指针数据的大小
字长决定虚拟地址空间的最大大小
字长为w,虚拟地址的范围为1-(2^w-1)
w=32或64:通常说的电脑是32位还是64位,(CPU一次处理数据的位数)
3.数据大小
4.寻址和字节顺序
小端法——在存储器中按照从最低有效字节到最高有效字节的顺序存储对象(高对高,低对低)
大端法——从最高有效字节到最低有效字节的顺序存储(高对低,低对高)
5.表示字符串
c语言中字符串被编码成为一个以null(值为0)字符结尾的字符数组(多使用ASCII字符码)
使用ASCII字符码的任何系统上都能得到相同的结果,与字节顺序和字大小规则无关
6.表示代码
二进制代码在不同的操作系统上有不同的编码规则,二进制代码不兼容
7.布尔代数
二进制值是计算机编码、存储、操作信息的核心(0、1)
8.位级运算
位运算————位向量(有固定长度为w,由0、1组成的串,每个对应元素之间的运算)
掩码:通过指定一个位向量掩码,有选择的使能或不能屏蔽一些信号(0表示被屏蔽)
位级表达式的计算,要将通过转化为二进制表示进行二进制运算再转换回原来的进制来进行
~0:生成一个全1的掩码
9.逻辑运算
逻辑运算——0或1
所有非零参数都代表TRUE,0参数代表FALSE
与位运算的区别:只有当参数被限制为0或1时,逻辑运算才与按位运算有相同的行为;如果对第一个参数求值就能确定表达式的结果,逻辑运算符就不会对后面的参数求值
10.移位运算
逻辑右移:在左端补k个0,多用于无符号数移位运算
算术右移:在左端补k个最高有效位的值,多用于有符号数移位运算
(算术左移和逻辑左移没有什么区别)
移位运算的优先级比算术运算(比如+、-)要低

二、整数表示

1.整型数据类型
32位机器和64位机器对于同一数据类型的典型取值范围是有所不同的
典型取值范围中,取值范围不对称——负数的范围比整数的范围大1
c语言标准定义的每种数据类型必须能够表示的最小的取值范围中,正数和负数的取值范围是对称的
数据类型long long是在ISO C99中引入的(编译:gcc -std=c99)
64位机器用8个字节表示;32位机器用4个字节表示
2.无符号数的编码
0-(2^w)-1中的每一个整数和长度为w的位向量是一一对应的
3.补码编码(有符号数的编码)
正数的补码=原码
负数的补码=原码各位取反再加1
负数的补码=原码各位取反再加1
最高有效位也叫符号位,解释为负权,“权重”为-2的(w-1)次方,即无符号表示中的权重的负数,符号位为1,表示值为负,符号位为0,表示值为非负(不是正,因为有0)
补码的映射关系同样是一一对应的
补码的范围:-2(w-1)~2(w-1)-1,即|TMin|=|TMax|+1(因为非负数中0的存在)
无符号数编码(U)和补码(T):UMax = 2 TMax + 1
大多数情况下用补码来表示有符号数,并且具有的是典型的取值范围
有符号数的其他表示方法:原码、反码
4.有符号数和无符号数的转换
转换原则:底层的位保持不变
无————>有:U2Tw函数(*w表示数据类型的位数)
以2的w-1次方为界限:小于它——保持不变;大于它——转换为负数值
有————>无:T2Uw函数
非负数——保持不变;负数——转换成大正数
5.扩展
零扩展:在开头添0(将无符号数转换成更大的数据类型)
符号扩展:添加最高有效位的值的副本(一个补码数字转换成更大的数据类型)
6.截断数字
可能会改变数值——溢出的一种形式
将一个w位的数截断为k位数字时,就会丢弃高w-k位
对于无符号数来说,就相当于 mod 2的k次幂
对于有符号数来说,先按照无符号数截断,然后再转化为有符号数

整数运算(模运算)

1.无符号运算
本质上就是mod 2的w次幂
2.补码运算
溢出:一个算术运算的溢出——完整的整数结果不能放到数据类型的字长限制中
整数运算实际上是一种模运算形式,表示数字的有限字长限制了可能的值得取值,结果可能溢出
3.补码的非
范围在[-2(w-1),2(w-1))中的x:x=-2(w-1)时,为-2(w-1);x>-2^(w-1)时,为-x
位级补码非:对每一位求补,再对结果+1;设k为最右面的1的位置,将k左边的所有位取反
4.乘以常数
常数为2的k次幂:左移k位
常数不是2的整数次幂:将常数C表示为2的几个整数次幂的和,结合移位运算和加法运算
5.除以2的幂
右移时需要区分无符号数和补码
整数除法总是舍入到零
无符号数——逻辑右移:无符号数除以2的k次幂,就等同于对其逻辑右移k位
补码——算术右移:x≥0时,除以2的k次幂等价于将x算术右移k位;x<0时,先将x加上(2^k)-1,再算术右移k位

浮点数

1.二进制小数
小数的二进制表示法只能表示那些能够被写成x X (2^y)的数,其他的值只能近似的表示
以小数点为界:左边第i位,权重为2的i次幂;右边第i位,权重为1/2的i次幂
2.IEEE浮点表示
用V = (-1)s * M * 2E的形式来表示一个数
符号:s决定这个数是负数(s = 1)还是正数(s = 0),而对于数值0的符号位解释作为特殊情况处理
尾数:M是一个二进制小数,它的范围是1 ~ 2-ε,或者是0 ~ 1-ε(ε=1/2的n次幂)
阶码:E的作用是对浮点数据加权,这个权重是2的E次幂(可能是负数)
将浮点数的位表示划分为三个字段,分别对这些值进行编码:一个单独的符号位s直接编码符号s;k位的阶码字段exp = ek-1…e1e0编码阶码E;n位小数字段frac = fn-1…f1f0编码尾数M,但是编码出来的值也依赖于阶码字段的值是否等于0
两种常见的格式:C语言中的单精度浮点格式float 和双精度浮点格式double
在float中,s、exp和frac字段分别为1位、k = 8 位和n = 23位,得到一个32位的表示
在double中,s、exp和frac字段分别为1位、k = 11 位和n = 52位,得到一个64位的表示
3.舍入
浮点运算只能近似的表示实数运算
舍入运算:找到和数值x最接近的匹配值x',可以用期望的浮点形式表示出来
4.浮点运算
浮点加法:浮点加法是可交换的;浮点加法不具结合性;大多数值的浮点加法都有逆元,除了无穷和NaN;浮点加法满足单调性
浮点乘法:浮点乘法是可交换的;浮点乘法不具有结核性;浮点乘法的单位元为1.0;浮点乘法在加法上不具备分配性;在一定条件下满足单调性
5.c语言中的浮点数
int → float 不会溢出但有可能舍入
int/float → double 结果保留精确数值
double → float 可能溢出为±∞,由于精确度较小也有可能被舍入
float/double → int 向零舍入,可能溢出

学习中的问题和解决过程

1.非规划值为什么可以均匀接近0?
如果全部用十进制表示,对于类似0.0123的浮点数,规格化的表示应为1.23e-2。但对于某些过小的数,如1.23e-130,允许的阶数位数不能满足阶数大小的需要,这时可能就会在尾数前添加前导0,如将其表示为0.000123e-126
但是非规格化浮点数有争议:可以使任何浮点运算可以在任何浮点数上操作,而不产生下溢出异常,但另一方面它也可能导致更多的除以0错误和NaN的出现
2.对于C语言中逻辑运算和位运算总是容易混乱

代码托管

代码托管连接

其他(感悟、思考等,可选)

教材第二章的内容多而且杂,感觉我的计算能力也不是很好,而且还有混淆的好多东西。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 30/30
第二周 300/500 1/3 20/50
第三周 100/600 1/4 20/70

参考资料

posted on 2016-09-28 14:14  20145305解佳玲  阅读(169)  评论(3编辑  收藏  举报