我们研究三种最重要的数字表示:无符号,补码以及浮点数。
2.1 信息存储:大多数计算机使用8位的块(一个字节)作为最小可寻址存储器单元。机器级别的程序将存储器看作一个非常大的字节数组,称为虚拟内存。存储器每个字节都由唯一的数组(地址)标识,所有地址的集合称为虚拟地址空间。(32位操作系统支持的最大地址空间是2的32次方字节,即4G,同理,64位支持2的64次方字节,一个地址对应一个字节)
2.1.1十六进制表示法:可以将4位二进制串看作是1位十六进制的数,当二进制转化为十六进制时,需要将二进制位数补齐,使位数成为4的倍数。
2.1.2 words:每台计算机都有一个字长,指明指针数据的nominalsize。虚拟地址以这样一个字来编码,字长决定系统的虚拟地址地址空间大小(如上文32位操作系统字长就是32位)
2.1.3 数据大小:计算机和编译器支持多种不同形式编码的数字格式:整数,浮点数。。。
2.1.4 寻址和字节顺序:排列一个对象的字节顺序有两个规则,即小端法(Little endian) 和大端法(Big endian)。对于一个整型(如01234567)存放在内存地址0x100-0x103中,大端法的最高有效字节在高地址(67存放在0x103),小端法的最高有效字节在低地址(67存放在0x100),其中大多是Intel兼容机都只用小端法。涉及网络编程时需要注意。
2.1.8 C中的位操作:常见用法为掩码运算,掩码作为一个位模式,表示从一个字中选出的位的集合,比如子网掩码将ip地址划分为网络地址和主机地址两个部分。
2.1.10 C中移位操作:对于左移,丢弃最高位,在右端补0。对于右移,分为逻辑右移和算术右移。前者在左端补0,后者在左端补最高有效位的值。无符号数右移必须是逻辑的,对于有符号数,几乎所有编译器和机器组合都对有符号数据使用算术右移。
2.2 整型表示:补码表示方法,符号位跟原码相同,对于非负数,数值部分跟真值相同,对于负数,数值部分取反后最低位+1。知道一个负数的补码,同样保持符号位不变,其他各位取反+1得到原码。原码,反码,补码,真值间转化。位扩展中,无符号数在前面添加0(0扩展),补码则在前面添加符号位(符号扩展)。截断数字介绍。
2.3 整数运算:无符号加法结果溢出问题,溢出则需要减去最大数值。对于补码,非负数的处理同无符号加法,负数的负溢出则需要加上正最大值。。。
2.4 浮点数:定点表示法:纯小数,小数点位置固定在最高有效数位之前。符号位之后。(小数点位置是隐含的)浮点表示法:N = M * (r的E次方)。E,M是带符号定点数。中E称为阶码,M称为尾数。大多数计算机中,M为纯小数,常用原码或补码表示,E为整数,常用移码或者补码表示。其中,浮点数表示范围主要由阶码的位数决定,而有效数字的精度则由为数位数决定。
为了提高运算精度,要充分利用尾数的有效位数,因此采用浮点数规格化形式,即规定尾数最高数位必须是一个有效值。规格化浮点数尾数M的绝对值范围在[1/r,1)之间(r是阶码的底)。因此,当尾数使用原码表示时,规格化浮点数尾数最高数位总为1(比如如果不是1,可以通过阶码-1来变成1)。
浮点数阶码的移码表示:X的移码= X + 偏置值。移码中最高位0表示负数,1表示正数。使用移码:1.便于比较浮点数大小,阶码大的,对应真值就大 2.简化机器判零电路。
IEEE 754标准浮点数:常用格式 ms E m 分别代表数符(0表示正数,1表示负数),阶码(移码表示),尾数数值位(原码表示)。其中分为三种浮点数,长度分别为32,64,80位,分别称为短,长,临时浮点数。短和长浮点数阶码的偏置值分别为127和1023.对应阶码分别为8,11,15位。对于规格化浮点数,因为其数值(尾数)最高位总是1,可以隐藏它而额外获得一个有效位,此时23位尾数数值实际是24位(1+23位)。
几种舍入方式介绍。IEEE标准制定一个简单的规则,确定诸如加法与乘法算术运算的结果,实际结果可能是舍入后的结果,而IEEE指定浮点运算行为方法的一个优势是,它可以独立于任何具体的硬件或者软件实现。