zoukankan      html  css  js  c++  java
  • [CSAPP笔记][第二章信息的表示和处理]

    信息的表示和处理

    2.1 信息存储

    • 机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器
    • 存储器的每个字节由一个唯一的数字表示,称为它的地址
    • 所有可能地址的集合称为虚拟地址空间

    2.1.1 十六进制表示法

    python 中十六进制的转变方法

    a=15;
    print(hex(a))
    
    //print:0xf

    2.1.2 字

    • 字长决定虚拟地址空间的最大大小
    • 32位的是4G(2^32)

    2.1.3 数据大小

    • char *使用了机器的全字长

    2.1.4 寻址和字节顺序

    • 小端法:大多数Intel兼容机规则(现在最为常用)

      • 高位放高地址
    • 大端法:IBM 和Sun Microsystems

      • 高位放低地址
    • printf(“%.2x “)解析

      摘自K&R《C程序设计语言》:
      点号,用语分隔字段宽度和精度
      表示精度的数。对于字符串,它指定打印的字符的最大个数;对于e、E或f转换,它指
      定打印的小数点后的数字位数;对于g或G转换,它指定打印的有效数字位数;对于整型数,它指定打印的数字位数(必要时可填充位0以达到要求的宽度)

    2.1.5 表示字符串

    • 在使用ASCII码作为字符码的任何系统都会表示相同的结果,与字节顺序和字大小规则无关。因而,文本数据比二进制数据具有更强的平台独立性

    • Java使用Unicode 来表示字符串。对于C语言也有支持Unicode的程序库

    2.1.6 表示代码

    即使是相同的一段代码,在不同的机器类型使用不同,不兼容的指令,因此二进制代码是不兼容的。

    2.1.7 布尔代数简介

    很简单

    • 位向量常用于集合的表述(状态压缩常用)

    2.1.8 C语言的位级运算

    ACM玩的很多了,就不说了

    2.1.9 C语言的逻辑运算

    • || && 惰性求值

    2.1.10 C语言的移位运算

    • 逻辑右移

      • 往左边补k个0
    • 算术右移

      • 往左边补k个最高有效位的值
      • 对有符号运算有奇效

    潜在问题

    • 对于无符号数据,右移必须是逻辑的。
    • 对于有符号数据,逻辑,算术都可以。
      • 几乎所有编译器对有符号使用算数右移
      • 许多程序员也假设使用算数右移
      • 可能会存在潜在的兼容性问题

    2.2 整数表示

    2.2.1 整数数据类型

    • 有符号
    • 无符号
    • 负数比正数大一(有一个-0被表示为最小的那个负数)

    2.2.2 无符号数的编码

    • 性质:双射

    2.2.3 补码编码

    用这种方式理解补码,是一种新的不错的思路

    • 很容易算出范围。不用思考转成原码
    • 双射,规则没有特例,很容易看出0不能表示两种。

    补码,反码

    2.2.5 C语言中的有符号数和无符号数

    • 默认为有符号,如果需要无符号某尾+U,例:12345U

    2.2.6 扩展一个数字的位表示

    • 对于一个无符号数转为更大的数据类型
      • 只需要简单地在表示的开头添加0,这种运算称为零扩展
    • 对于有符号的数,即补码

      • 进行符号扩展(sign extension),就是添加最高有效位的值
    • 对比逻辑右移,和算术右移

    2.2.7 截断数字

    • 截断一个数到k位,即舍去w-k的高位。

    • 对于无符号数截断x它到k位的结果相当于

      • B2U([Xk-1,Xk-2,….x0])=B2U([Xw-1,Xw-2…x0]) mod 2^k
    • 对于有符号的数x。

      • 截断的时候还是当做无符号的数看
      • B2T([Xk-1,Xk-2,….x0])=U2T(B2U([Xw-1,Xw-2…x0]) mod 2^k
        )

    建议

    • 在大多数情况下使用有符号整数
      • java中只支持有符号整数,>>算数右移,>>>才是逻辑右移

    2.3 整数运算

    2.3.1 无符号加法

    • x+y = (x+y) mod 2^k
    • 溢出会舍去

    • 阿贝尔群,群论。

    2.3.2 补码加法

    • 大多数计算机使用同样的机器指令来执行有符号和无符号之和。

    • x(有符号+)y= U2T(T2U(x+y) mod 2^w)

        1. 先计算x+y
        1. 将x+y转换为无符号类型z。
        1. p=z mod 2^w
      • 附.(或者直接对x+y的二进制表示进行截断得到p)
        1. 将p用有符号类型表示
    • 正溢出,正常,负溢出。

    2.3.3 补码的非

    • 因为正负区间的不一致
    • 所以最小的那个负数的相反数逆元还是最小的那个负数。

    • 对于任意整数x-x~x+1得到的结果完全一样。

    2.3.4 无符号乘法

    • 只取低w位表示的值,其余截断

    2.3.5 补码乘法

    • 对于无符号和补码乘法,乘法运算的位级表示都是一样的,是同一条指令。

    • 无符号和补码相乘出来的两个数的低W位 永远相等。证明见书。

    2.3.6 乘常数

    • 因为乘法速度太慢,机器可能会用(加法,减法,移位)来代替乘法。

    2.3.7 除以2的幂

    • 对于无符号类型或整数,直接右移不会有任何问题。

    • 对于负数,最后的值为-48.3,会舍入成 -49,而不是-48.

      • 解决方法是偏置
      • 原理:
      • C语言

        (x<0 ? (x+(1<<k)-1):x)>>k
        等价于x/pwr2k ,pwr2k=2^k

    2.4 浮点数

    之后看,现在先过别的。

  • 相关阅读:
    异常处理
    JPG转换成BMP不成功???
    Vmware 7 下装载的最新Ubuntu10.04镜像会出现无法识别键盘输入的解决方法
    动态IP获取
    最佳Web设计资源
    设置NFS
    Ubuntu设置root用户自动登录
    编译QT4.5
    tq2440修改默认串口不支持打印控制台
    英语作文
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480507.html
Copyright © 2011-2022 走看看