20155212 2017-2018-1 《信息安全系统设计》第3周学习总结
20155212 2017-2018-1 《信息安全系统设计》第3周学习总结
教材学习内容总结
Chapter 2
- 三种最重要的数字表示
无符号
编码:基于传统的二进制表示法,表示大于或者等于零的数字。——表示无符号整数
补码
编码:表示有符号整数
的最常见的方式,有符号整数
就是有正负的数字。——表示有符号整数
浮点数
编码:是表示实数的科学计数法的以2为基数的版本。——表示浮点数
- 计算机的表示法是用有限数量的位来对一个数字编码。
- 整数运算和浮点数运算会有不同的数学属性是因为前者是精确的,后者是近似的,先精确再近似,还是先近似再精确会带来不同的结果。e.g.(3.14+1e20)-1e20=0, 3.14+(1e20-1e20)=3.14。
- 32位程序和64位程序的区别在于编译的不同,而与运行的机器的类型无关。
- 多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。每个地址存放四个字节。e.g.int32_t类型变量地址为0x100,地址表达式&x的值为0x100,为什么会被存储在内存的0x100、0x101、0x102和0x103四个位置。
- 小端法和大端法
- 字节顺序较重要的三种情况:
- 大端法机器与小段法机器之间传输数据
- 阅读表示整数数据的字节序列(反汇编)
- 编写规避正常的类型系统的程序时
- 不同的机器类型使用不同的且不兼容的指令和编码方式。
- 有符号数到无符号数的隐式强制类型转换导致了某些非直观地行为。
- 浮点运算只有有限的范围和精度,不遵守普遍的算术属性。
- 8位一字节,最小的可寻址的内存单位,而不是访问内存中单独的位。
- 字长:指明指针数据的标称大小。决定虚拟地址空间的最大大小,对于一个字长的w位的机器而言,虚拟地址的范围为0~2w-1,程序最多访问2w个字节。
- 机器级程序将内存视为一个非常大的字节数组。
- 对象地址为所使用字节中的最小的地址。
- 在一定地址范围内的字节顺序依赖于机器的类型,即大端模式和小端模式。
- C语言中字符串被编码为一个以null(0)字符结尾的字符数组。
- 不同的机器类型适用不同的且不兼容的指令和编码方式。二进制代码是不兼容的。
- 计算机系统的一个基本概念就是:从机器的角度来看,程序仅仅只是字节序列。
- 布尔环中的加法是^,加法逆元是输的本身。
- 使用位向量[aw-1, …… , a1, a0]编码{0,1, ……,w-1}的任何子集。
- 位运算是逐位运算,逻辑运算的结果限制为结果只能为0、1。
- 移位运算:
- 左移:补0
- 逻辑右移:补0
- 算术右移:补最高有效位
- long:32位机器:4字节;64位机器:8字节
- 负数的范围比整数的范围大1
- 无符号数的编码:B2U(x->)=x*(2^x)之和
- 补码编码(计算机中最常见的有符号数表示方式):B2T=最高位x最高位权重+其他位权重之和
- 强制类型转换的结果保持位值不变,只是改变了解释这些位的方式。
- C语言中,当执行一个运算时,如果它的一个运算数是有符号的,而另一个是无符号的,那么C语言会隐式地将有符号参数强制类型转换为无符号数,并假设这两个数都是非负的来执行这个运算。
- 扩展数字的位表示
- 无符号数的零扩展
- 补码数的符号扩展
- 截断数字
- 截断无符号数:x'=xmod(2^k) 截断k位
- 截断补码数值:x'=U2(T_k)(xmod2^k)
- 有符号数到无符号数的隐式强制类型转换导致了某些非直观的行为。
- 无符号加法
- 正常:x+y
- 溢出:x+y-MAX
- 溢出的检测:x+y<x or x+y<y
- 无符号数求反
- x, x=0
- 2^w-x, x>0
- 补码加法
- x+y-MAX, 正溢出
- x+y, 正常
- x+y+MAX, 负溢出
- 补码的非
- TMin
- -x, x>TMin
- 无符号乘法:x*y=(x·y)mod(2^w)
- 补码乘法:x*y=U2T((x·y)mod(2^w))
- 无符号和补码乘法的位级等价性:T2B(xy)=U2B((x'y')
- 乘以常数
- 乘以2的幂:x2^k的w+k位表示:后面增加k个0
- 与2的幂相乘的无符号乘法&补码乘法:x<<k
- 除以2的幂
- 无符号除法:x>>k
- 补码除法(向下舍入):算术右移k位
- 补码除法(向上舍入):(x+(1<<k)-1)>>k
- IEEE浮点表示:V = (-1)^s * M * 2^E
- 整数值和单精度浮点值在危机表示上有如下关系:相关的区域对应于整数的低位,刚好在等于1的最高有效位之前停止(这个位就是隐含的1),和浮点表示的小数部分的高位是相匹配的。
- 舍入:找到最接近x的匹配值x'。
- 向偶数舍入/向最接近的值舍入(默认)
- 向零舍入(正数向下、负数向上)|x'|<=|x|
- 向下舍入
- 向上舍入
- 浮点运算
- 加法不具有结合性
- 乘法不具有分配性
- C语言中的浮点数运算
- int->float 数字不会溢出,但是可能被舍入
- int/float->double 能保留精确的数值
- float/double->int 值将会向零舍入
教材学习中的问题和解决过程
- 什么是编码?
- 编码是信息从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码。
- 溢出会带来什么安全问题吗?
- 整数溢出是不能被立即察觉,因此没有办法去用一个应用程序来判断先前计算的结果是否实际上也是正确的.如果是用来计算缓冲区的大小或者计算数组索引排列的距离,这会变的危险。当然很多整数溢出并不是都是可利用的,因为并没有直接改写内存,但是有时,他们可导致其他类型的bugs,缓冲区溢出等.而且,整数溢出很难被发现,因此,就算是审核过的代码也会产生意外。
void **
和void *
指的是什么?void*
是不带类型的指针,而void**
是带类型的指针,就这个不同而对于不带类型的指针来说,不能进行算术运算,而带类型的指针就可以进行算术运算了。
- 为什么要用补码?
- 使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
- 为什么复数的范围比整数的范围大1?
- 以8位为例。整数最大是(01111 1111)B=127,负数最小的是(1000 0000)B=-128。重点在于:有符号整数编码是用补码表示,补码中的1兼有符号和数字的双重含义。
代码托管
其他
- 这一章的可读性不强,很多计算和公式,但是讲解得深入浅出,结合图像和实例,很多第一眼看上去难懂的概念都能被阐述清楚。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 96/96 | 1/1 | 15/15 | |
第二周 | 30/126 | 1/2 | 21/36 | |
第三周 | 30/156 | 1/3 | 21/57 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:20小时
-
实际学习时间:24小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)