《深入理解计算机系统》2——信息编码

      计算机中数字的主要表示方式有无符号数,补码数和浮点数三种。计算机中最小可寻址单位为8位的块,或者称为字节。机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器,虚拟存储器中每个字节由唯一的数字来标识:地址,所有可能地址空间的集合称为虚拟地址空间。64位机器和32位机器主要的不同是:指针用8字节表示,long int用8字节表示,32位中都为4字节。另外,不同的机器寻址的字节顺序不同,intel是小端,IBM和sum是大端,小端大端对于机器级程序员是不可见的,不过网络通讯时需要考虑信息转换。

      字符串编码是以null字符结尾的字符数组。ascii码的字符串不存在字节顺序的问题。因而文本数据比二进制数据更通用。

      c语言提供了逻辑运算,移位运算等位级操作,这些操作比通常意义上的逻辑运算,算术运算快速的多。注意右移运算分逻辑右移和算术右移两种:前者简单的在左边填充0,后者在左边填充最高位,算术右移是非常有用的,因为在补码数中,算术右移具有保符号,保正确性。

       整数的无符号数编码最简单,略去不说。

       整数的补码编码是针对应用中需要表示负数的情形,采用补码有三个原因:一是一一对应,二是容易实现移位操作,三是x的加法逆元就是-x。这种情况下,字的最高有效位解释为负权。其他位和无符号数编码一致。有符号数到无符号数的隐式强制转换(位不变,解释方式改变)会导致一些特殊的程序错误(比如负数被解释为大的整数,导致数组溢出),因此不建议使用无符号数。

        整数的加法运算通常会出现溢出。补码表示中,可能出现正溢出或者负溢出。判断方法是异号加法不会产生溢出,同号运算结果的绝对值必须大于这两个元素任一的绝对值。减法与逆元相对应,乘法与移位操作相对应,除法比较复杂。

        浮点数的编码很复杂,目前应用较广泛的是IEEE754标准,这是一个优雅而细致的标准。标准以V=(-1)^S*M*2^E 表示一个数。S是符号位,决定数字的正负,1位表示;E是阶码字段的编码,8位或11位表示;M是尾数,范围是0~1-t或者1-2-t,23位或52位表示,共32位或64位(单双精度浮点数:float,double)。根据E的取值范围,被编码的值分为规格化的(阶码非全0也非全1),非规格化的(阶码全0),无穷大(阶码全1)。规格化的值是最普遍的情况,此时阶码E字段被解释为以偏置形式表示的有符号数。偏置值为127或1023,阶码值=E-偏置值,故指数取值范围为-126~127或-1022~1023.小数值部分解释为0.fn-1fn-2...f0,即最高位定义在最高有效位的左边。尾数定义为1+f,取值范围为1~2。非规格化数是第二种情况,这种情况下阶码值E=1-偏置值,尾数值M=f,也就是小数字段的值,不包含隐含的开头的1,非规格化数有两个用途:一是用来表示0,事实上0的编码时全0;另外一个功能是表示那些非常接近0.0的数字,它们提供一种属性,称为逐渐溢出,其中,可能的数值分布均匀接近于0.0。最后一种情况是无穷大。

       因为表示方法限制了浮点数的精度和范围,浮点运算只能近似的表示实数运算,我们希望在计算的过程中能系统的找到能表示的最接近于计算结果的匹配值,这就是舍入计算的任务了。IEEE754浮点数默认是向偶数舍入。具体的浮点运算后面再介绍。

你可能感兴趣的:(信息编码)