学习计时:共18小时
读书:5
代码:2
作业:6
博客:5
第二章、信息的表示和处理
现代计算机存储和处理的信息以二值信号表示。这些二进制数字奠定了数字革命的基础。
三种重要的数字表示:无符号编码,补码编码(有符号),浮点数编码。
当结果太大不能表示时某些运算就会溢出,会导致一些令人吃惊的后果。
2.1 信息存储
大多数计算机使用8位的块,或者字节,作为最小的可寻址存储器单位。
机器级程序将存储器视为一个非常大的字节数组,称为虚拟储存器。每个字节都由唯一的数字标识,称为地址。
虚拟地址空间:所有可能地址的集合
每个程序对象即程序数据、指令和控制信息。可视为字节块,程序本身是一个字节序列
2.1.1 十六进制表示法
C语言中,以0x或OX开头的数字常量被认为是十六进制的值。
2.1.2 字
每台计算机都有一个字长,指明整数和指针数据的标称大小。
今天大多数计算机的字长都是32位,这就限定了虚拟地址空间为4K兆字节。
对于字长为w位的计算机而言,虚拟地址范围为0~2^w-1,最多访问2^w个字节。
大多数计算机字长为32位,实验楼为64位。
gcc -m32 可以在64位机上生成32位的代码。
2.1.3 数据大小
见书p26图2-3
两种不同的浮点数格式:单精度 双精度
格式:4字节 8字节
2.1.4 寻址和字节顺序
字节顺序是网络编程的基础。
小端法:最低有效字节在最前面,高对高,低对低。
大端法:最高有效字节在最前面,高对低,低对高。
比较新的处理器使用双端法。
反汇编器:确定可执行程序文件所表示的指令序列的工具。
在C语言中可以使用强制类型转换来访问和打印不同程序对象的字节表示。
sizeof 确定对象使用字节数
不同的操作系统有不同的分配规则,结果相同,指针值却完全不同
字节模式 整型 0x00003039 浮点数 0x4640E400
2.1.5 表示字符串
V语言中字符串被编码为一个以null(其值为0)字符结尾的字符数组。每个字符都由某个标准编码来表示,最常见的为ASCII字符码。
文本数据比二进制数据具有更强的平台独立性。
库函数strlen不计算终止的空字符。
*ASCII字符集适合于编码英语文档,但是在表达一些特殊字符方面没有太多办法,完全不适合希腊语、俄语和中文这样语言的文档。
*基本编码也称为Unicode的“统一字符集”,使用32位来表示常见字符。
2.1.6 表示代码
二进制代码是不兼容的,很少能在不同操作系统间移植。
2.1.7 布尔代数简介
与 或 非 异或
位向量的运算可以定义成参数的每个对应元素之间的运算。
位向量有个很有用的应用:表示有限集合。
2.1.8 C语言中的位级运算
C语言的一个特性:支持按位布尔运算。
确定一个位级运算最好的方法:将十六进制的参数扩展成二进制表示并执行二进制运算,然后再转换回十六进制
位级运算的常见用法:掩码运算(掩码是一个位模式,表示从一个字中选出的位的集合)
2.1.9 C语言中的逻辑运算
逻辑运算符:|| — OR ; && — AND ; ! — NOT
逻辑运算认为非零的参数都表示为TRUE,而参数0表示FALSE。
逻辑运算符&&和||与对应的位级运算&和|的重要区别:如果对第一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值。
2.1.10 C语言中的移位运算
<< >>
逻辑右移:左端补0
算数右移:左边补最高有效位
对于无符号数据,右移必须是逻辑的;对有符号数据两者皆可。
2.2 整数表示
2.2.1 整型数据类型
整型数据类型:有限范围的整数
取值范围中,负数的范围比整数的范围。大1
2.2.2 无符号数的编码
无符号数的二进制表示有个重要属性:每个介于0~(2^w)-1之间的数都有唯一一个w位的值编码。
2.2.3 补码编码
最常见的有符号数的计算机表示方式就是补码形式,将字的最高有效位解释为负权。
最高有效位也称符号位。
权重-2的位数次方,是无符号表示中权重的负数。
最小值[10...0] 最大值[01...1]
每个介于-2^w-1和2^w-1之间的整数都有一个唯一的长度为w的位向量二进制表示。
|TMin|=|TMax|+1 → TMin没有与之对应的正数。
最大的无符号数值刚好比补码的最大值的两倍大1:UMax=2TMax+1
2.2.4 有符号数和无符号数之间的转换
数值可能会改变,但是位模式不变。
2.2.5 C语言中的有符号数与无符号数
通常大多数数字都默认为有符号的。
要创建一个无符号常量,必须要加上后缀字符U或u。
转换的原则是底层的位保持不变。
如果一个运算一个有符号一个没符号,会将有符号强制转换为无符号并且假设两个数都是非负的。
2.2.6 扩展一个数字的位表示
在不同字长的整数之间转换,同时又保持数值不变是一种常见的运算。
将一个数转换为一个更大的数据类型:开头添0(零扩散)。
补码:在表示中添加最高有效位的值的副本(符号扩展)。
2.2.7 截断数字
截断一个数字可能会改变他的值——溢出的一种形式。
2.3 整数运算
2.3.1 无符号加法
无符号运算可以被视作一种模运算形式。
无符号加法等价于计算和模上2^w。
算术运算溢出:指完整的整数结果不能放到数据类型的字长限制中去。
2.3.2 补码加法
两个数的w位补码之和与无符号之和有完全相同的位级表示。
2.3.3 补码的非
2.3.4 无符号乘法
范围在0≤x,y≤2^w-1内的整数x和y可以表示为w位的无符号数,但是他们的乘积x*y的取值范围到0~(2^w-1)²=2^2w-2^(w+1)+1之间。
2.3.5 补码乘法
范围在-2^(w-1)≤x,y≤2^(w-1)-1内的整数x和y可以表示为w位的补码数字,但是他们的乘积x*y的取值范围到-2^(w-1)*[2^(w-1)-1]=-2^(2w-2)+2^(w-1) ~ 2^(2w-2)之间。
2.3.6 乘以常数
优化:用移位和加法运算的组合来替代乘以常数因子的乘法。
2.3.7 除以2的幂
对于一个正整数,最高有效位为0,所以效果与逻辑右移是一样的。
对于非负数来说,算术右移k位与除以2^k是一样的。
2.4 浮点数
对形如V=x*2的y次方的有理数进行编码。他对执行设计非常大的数字(|V|》0)、非常接近于0(|V|《1)的数字,以及更普遍的作为实数运算的近似值的计算是很有用的。
2.4.1 二进制小数
2.4.2 IEEE浮点表示
IEEE浮点标准:V=(-1)的s次方*M*2^E
符号:s决定正(0)负(1)
尾数:M是二进制小数,范围1 ~ 2-ε 或 0 ~ 1-ε
阶码:E的作用是对浮点数加权
情况1:规格化的值:当exp的位模式既不全是0,也不全是1
情况2:非规格化的值:阶码域全0,所表示的数就是非规格化形式
情况3:特殊值:阶码全1
2.4.3 数字示例
2.4.4 舍入
表示方法限制了浮点数的范围和精度,浮点运算只能近似的表示实数运算。
舍入的运算任务:找到最接近的匹配值。
IEEE定义了四种舍入方式。
默认方法找到做接近的匹配,其他三种用于计算上界和下界。
向偶数舍入(默认):向上舍入,向下舍入
2.4.5 浮点运算
IEEE标准中指定浮点运算行为方法的优势:独立于任何具体的硬件或者软件实现。
浮点加法不具有结合性
浮点加法满足了单调性
浮点乘法不具有可结合性
浮点乘法在加法上不具备分配性
只有有限的范围和精度
2.4.6 C语言中的浮点数
两种不同的浮点数据类型:float和double