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

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

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

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

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

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

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

        浮点数的编码很复杂,目前应用较普遍的是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。最后一种状况是无穷大。ci

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

相关文章
相关标签/搜索