zoukankan      html  css  js  c++  java
  • 深入理解计算机系统

    1. 基础概念
      1. 整数的表示虽然只能编码一个相对较小的数值范围,但是这种表示是精确的;而浮点数虽然可以编码一个较大的数值范围,但是这种表示只是近似的。
      2. 由于表示的精度有限,浮点运算是不可结合的。
    2. 信息存储
      1. 字节是最小的可寻址的内存单元。内存可以看成一个非常大的字节数组,内存的每一个字节由唯一的数字来标识(地址)。所有可能地址的集合就是虚拟地址空间。
      2. c语言把每个指针和类型信息联系在了一起,指针的值表示某个对象的位置,而它的类型表示那个位置上所存储的对象的类型。
      3. 字长决定了虚拟空间的最大大小,一个字长为w位的机器,虚拟地址的范围是$0-2^w-1$,最多可访问$2^w$个字节。字长是指针数据的标称大小。
      4. 多字节对象被存储为连续的字节序列,对象的地址为所用字节的最小的地址。
      5. 小端法与大端法
        1. 在内存中从最低有效字节到最高有效字节顺序存放对象叫做小端法。
        2. 在内存中从最高有效字节到最低有效字节存放数据叫做大端法。
        3. 例如int型变量x位于ox100处,存放的数据为0x01234567,地址ox100~ox103的字节顺序依赖于机器的类型
        4. image
      6. c语言中的移位运算
        1. 算术左移与逻辑左移一样,将x左移k位,是丢弃最高的k位,在最低的k位补0.移位运算是从左到右可结合的。x<<j<<k等价于(x<<j)<<k。
        2. 逻辑右移是在最高位补k个0,算术右移是在最高位补k个最高符号位。
        3. 几乎所有的编译器、机器组合都对有符号数进行算术右移,对于无符号数来说,右移必须是逻辑的。
        4. 当移位k大于数据的长度时,比如对整型变量x(4个字节32位)。x>>k,如果k大于32,那个实际位移量为k mod 32。
    3. 整数表示
      1. 补码编码
        1. image
        2. 最高有效位$2_{w-1}$也称为符号位,它的权重为$-2^{w-1}$。
        3. image
      2. 有符号数还有两种编码方式
        1. 反码。
          1. 除了最高有效位的权重为$-(2^{w-1}-1)$,其他和补码一致。
          2. image
        2. 原码
          1. 最高有效位是符号位,用来决定剩下的位应该取负权还是正权。
          2. image
        3. 原码变反码:符号位不变,其他位取反
        4. 原码变补码:符号位不变,其他位取反在加一。。
      3. 无符号数和有符号数进行转换时,强制转换的结果保持位值不变,只是改变了解释这些位的方式。比如-1映射到了$U_max$,$T_min$映射到了$T_max+1$。
      4. c语言在进行无符号数和有符号数运算时,是将有符号数转换成无符号数进行运算。
      5. 扩展一个数字的表示
        1. 无符号数进行零扩展。
        2. 有符号数进行符号扩展。
      6. 截断一个数字的方式时,直接去除截断的位数。
        1. image
    4. 整数加法
      1. 无符号加法判断溢出:s=x+y。s<x或者s<y,则说明有溢出
      2. 补码加法
        1. image
        2. 两个数的w位补码与无符号数加法有着相同的位级表示。
        3. x>0,y>0,x+y<=0说明发生了正溢出,x<0,y<0,x+y>=0说明发生了负溢出。
        4. $T_min$的相反数还是$T_min$
      3. 补码的非(相反数)
        1. -x与$~x+1$的结果相同
    5. 乘法运算
      1. 无符号乘法  : image
      2. 补码乘法  :  c语言中的有符号乘法通过将2w位的乘积截断为w位来实现的,将一个补码数截断为w位,相当于先计算该值模$2^w$,再将无符号数转换成有符号数。
        1. image
    6. IEEE浮点表示
      1. IEEE754的浮点表示为$v=(-1)*M*2^E$。其中s为符号位,E为阶码,M为尾数。$E=e-bias$。其中bias为偏置,在32位的浮点数中,bias为-127($2^k-1 – 1 k=8$),M为尾数位。$M=1+f$ f为小数。
      2. image
      3. image
      4. 当阶码E 为全0且尾数M 也为全0时,表示的真值x 为零,结合符号位S 为0或1,有正零和负零之分。当阶码E 为全1且尾数M为全0时,表示的真值x 为无穷大,结合符号位S 为0或1,也有+∞和-∞之分。
      5. 其中阶码全0表示非规格化数,全1用来表示无穷大和非数。对于规格化的数,$E=e-bias$,对于非规格化数$E=1-bias$。以8位浮点数为例,s=1,阶码位k=4,尾数位n=3。其偏置$bias =2^(k-1)-1 = 7 $。那么最小的规格化数为阶码为0001,尾数全0,表示的数为$1*2^(1-7)=frac{1}{64}$。最大规格化数为阶码为1110,尾数全为1,表示的数为$1.111*2^(14-7)=frac{15}{8}*2^7=240$。所以规格化数的范围为$frac{1}{64}-240$。对于非规格化数,指数为$1-bias=-6$,最小的非规格化数,尾数最小为001。表示的值为$0.001*2^(-6)=frac{1}{8}*frac{1}{64}=frac{1}{512}$。最大的非规格化数,其尾数位111。表示的值为$0.111*2^(-6)=frac{7}{8}*frac{1}{64}=frac{7}{512}$,所以非规格化数的范围为$frac{1}{512}-frac{7}{512}$。可以看出非规格化数与规格化数是平滑详解的,这也是为什么非规格化数的阶码选择$1-bias$的原因。最大的规格化数为240,超出这个值会溢出到无穷大。
      6. image
      7. 浮点运算缺乏结合性和分配性
      8. 当进行舍入时,会向最接近的值舍入,如果处于正中间,则默认向偶数舍入。

  • 相关阅读:
    iOS中使用nil NULL NSNULL的区别
    Xcode常用快捷键总结
    (求租仓库)navigationController .navigationBar 的属性设置
    imageNamed 与 initWithContentsOfFile 区别
    iOS-Senior10-多线程(子线程创建)
    iOS-setValue和setObject的区别
    iOS-Senior8-网络之进阶
    iOS-Senior7-数据请求
    iOS-Senior6-数据解析(JSON)
    iOS-Senior6-数据解析(XML)
  • 原文地址:https://www.cnblogs.com/cyj1258/p/12576939.html
Copyright © 2011-2022 走看看