美文网首页
Charpter Two 信息的表示和处理

Charpter Two 信息的表示和处理

作者: 1nfinity | 来源:发表于2017-10-24 14:15 被阅读0次
  • 2.1 信息存储
    • 2.1.4 表示字符串
      • 独立性(文本数据/二进制数据)
        • 文本数据比二进制数据具有更强的平台独立性
          • 原因: 在使用ASCII码作为字符码的任何系统上都将得到相同的结果
    • 2.1.6 布尔代数简介
      • 位向量
        • 定义: 位向量是固定长度为w, 由0和1组成的串
        • 应用:
          • 表示有限集合
            • 例:
              • a = [01101001] 表示 A = {0, 3, 5, 6}
              • a = [01010101] 表示 A = {0, 2, 4, 6}
            • 布尔运算|和&分别对应于集合A的交与并, 而~对应于集合的补
      • 分配律:
        • &对|: a&(b|c) = a&b|a&c
        • |对&: a|(b&c) = a|b&a|c
      • 加法逆元:
        • a^a = 0
        • (ab)a = b
    • 2.1.7 C语言中的位级运算
      • 掩码:
        • 定义: 掩码是一个位模式, 表示从一个字中选出的位的集合
        • 例: 假设 x = 0xEDFCA3423, x&0xFFLE可以提取出x的最低八位字节, 即提取后的值为: 0X00000023
      • 按位取补: 即按位取反, 运算符为: "~"
    • 2.1.8 C语言中的逻辑运算
      • 注意:
        • 逻辑运算很容易与位级运算相混淆, 但它们的功能是完全不同的
        • 逻辑运算认为所有==非零==(包括1)的参数都表示TRUE, 参数0表示FALSE. 它们返回0或者1
    • 2.1.9 C语言中的移位运算
      • 补充知识:
        • 操作数: 操作数是运算符作用于的实体,是表达式中的一个组成部分,它规定了指令中进行数字运算的量
      • 移位运算的结合性
        • 移位运算是从左至右可结合的, 所以x<<j<<k == (x<<j)<<k
        • 右移运算有两种
          • 逻辑右移: 左端补上n个0
          • 算术右移: 左端补上n个最高位
        • 注意:
          • C语言没有明确定义使用哪种类型的右移, 而Java明确规定算术右移使用x<<j, 逻辑右移使用x<<<j
          • 几乎所有的编译器使用算术右移
        • 移动k位, k大于位数w:
          • C语言未规定, Java明确规定位移数量应该按照我们前面所讲的求模(mod)方法来计算
            • 求模方法(mod): 求余数, 特别: 3mod5 = 3
  • 2.2 整数表示
    • 2.2.1 整数类型数据
      • 固定大小数据类型:
        • int32_t/int64_t: 为了平台的可移植性而设计的固定位长的数据类型, 分别为32位/64位
    • 2.2.2 无符号数的编码
      • 定理: 无符号数编码具有唯一性, 即其二进制表示和十进制表示是一一对应的
      • 中英文对比:
        • 补码: two's-complement
        • 负权: negative weight
          • 解释: 有符号数中字的最高有效位
        • 反码: ones'complement
          • 注意: 补码(two' complement)和反码(ones'complement)中撇号("'")的位置是不同的
            • 原因: 见原书P48
    • 2.2.4 有符号数和无符号数之间的转换
      • 规则(一般): 数值可能会改变, 但是位模式不变
        • 当将一个有符号数映射为它相应的无符号数时, 负数会被转换成大的正数, 而非负数会保持不变
    • 2.2.5 C语言中的有符号数和无符号数
      • 默认: 声明整数时, 一般默认是有符号数. 例: 12345
        • 无符号常量: 在后面添加"U"或"u", 例: 12345U
      • 奇特的行为:
        - 当执行一个运算时, 如果它的一个运算数是==有符号的==而另一个是==无符号的==, 那么C语言会隐式地将有符号参数强制类型转换为无符号数, 并假设这两个数都是非负的
    • 2.2.6 扩展一个数字的位表示
      • 分类
        1. 无符号数:
          • 扩展类型: 零扩展(zero extension)
            • 定义: 简单地在数值的开头添加0
        2. 补码数:
          • 扩展类型: 符号扩展
            • 定义: 在数值的开头添加最高位的值
      • 类型和大小的同时转换
        • 原则(C语言规定): 先进行大小转换再进行类型转换
    • 2.2.7 截断数字
      • 分类:
        1. 无符号数:
          • 原理: 直接截断
        2. 补码数:
          • 原理: 截断后把最高位转换为符号位
    • 2.2.8 关于有符号数和无符号数的建议
      • 绝不使用无符号数
        • 原因: 有符号数到无符号数的隐式转换会导致错误或漏洞
  • 2.3 整数运算
    • 2.3.1 无符号加法
      • 原理: 当无符号数之和溢出时, 会丢弃溢出的位
      • 检测溢出
        • 方法: 对在范围 0<=x, y<=UMax 中,令 s = x + y. 则当且仅当s<x(或等价的s<y)时, 发生溢出
          • 推导: 很简单, 利用结果超过UMAx会溢出的特性可轻松求得
      • 无符号数求反
        • -x = 2^w - x
    • 2.3.2 补码加法
      • 原则: 范围必须在 -2^w ~ 2^w 之间
    • 2.3.3 补码的非
      • bug: 由于求反的数是关于0对称的, 而补码的范围则是非对称的(-a <= x < a), 因此在x = -a即x = TMin时, -x不等于 -TMin, 而是由于溢出等于 Tmin
      • 小贴士:
        • 使用一个十六进制数字 a 表示长度w = 4的位模式时, a 里面已经包含了正负号的信息, 所以这个数字一定是非负数
    • 2.3.7 除以2的幂
      • 负数除法的偏置
        • 在通过移位计算除法时, 需要偏置这个值, 偏置的大小为2^k - 1
        • 偏移技术的使用范围:
          • 偏移技术只适用于负数, 如果用于正数, 则除不尽的结果会比正确值大1
      • 除以2的幂可以通过逻辑或算术右移来实现, 但这种方法不能推广到除以任何常数
    • 2.3.8 关于整数运算的最后思考
      • 计算机执行的"整数"运算实际上是一种模运算形式
        • 模运算表示了数字的有限字长限制了可能的值的取值范围, 结果运算可能溢出.
    • 2.4.2 IEEE浮点表示
      • 表示形式:
        • V = (-1)s * M * 2E
          • 符号(sign): s决定这个数是正还是负, 对数值0做特殊处理
          • 尾数(significand): M是一个二进制小数, 范围为: 1~2-ε, 或者0~1-ε
          • 阶码(exponent): E的作用是对浮点数加权
      • 表示形式的编码:
        • 一个单独的符号位s直接编码符号s
        • k位的阶码字段exp=ek-1...e1e0编码阶码E
        • n位小数字段frac=fn-1...f1f0编码尾数M, 但编码的值也依赖于阶码字段的值是否等于0
      • 根据exp的值不同分为的三种情况:
        • 情况1: 规格化的值
          • exp不全为0, E = e - Bias, Bias = 2k-1 - 1, M = 1+ f (0<=f<1>>)
        • 情况2: 非规范化的值:
          • exp全为0, E = 1 - Bias, M = f
        • 情况3: 特殊值
          • exp全为1
            • 小数域全为0, 表示无穷大
            • 小数域不为0, 表示"NaN"
        • 向偶舍入:
          • C语言默认使用向偶舍入
          • 原则: 舍入到最接近的值, 如进行舍入的值处于两个可能结果的正中间,则按使结果的最低有效数字是偶数的方向舍入
          • 注意:
            • 1.555/2.555在C语言中的舍入结果是不一样的, 前者结果为1.55, 后者结果为2.56
              • 原因: 1.555在浮点数中的最精确表示为:1.55499994754791259765625E0, 2.555则为: 2.5550000667572021484375E0. 根据向偶舍入的原则,1.555舍入为1.55, 2.555舍入为2.56
      • 必须小心的使用浮点运算, 因为浮点运算只有有限的范围和精度, 而且并不遵守普遍的算术属性

相关文章

  • Charpter Two 信息的表示和处理

    2.1 信息存储2.1.4 表示字符串独立性(文本数据/二进制数据)文本数据比二进制数据具有更强的平台独立性原因:...

  • 信息的表示和处理

    比特及位级运算 现代计算机存储和处理信息以二进制信号表示,一个二进制数称为位。大多数的计算机使用8位,或者字节,作...

  • 信息的表示和处理

    主要研究三种数字表示1、无符号编码2、补码编码3、浮点数编码 一些基本概念 整数表示相对小的数值范围,但是一个精确...

  • 信息的表示和处理

    在阅读《深入理解计算机系统》的过程之中,有一些知识点是我觉得有必要记录下来的,在这里进行一定的总结。 文本数据比二...

  • 信息的表示和处理

    信息的存储 字数据大小 计算机中,字长指的是指针数据标称大小,虚拟地址以字来进行编码的,所以字长w位的机器,可以表...

  • 信息的表示和处理

    现代计算机存储和处理的信息以二值信号表示。这些微不足道的二进制数字,或者称为位 (bit), 形成了数字革命的基础...

  • 信息的表示和处理(1):信息存储

    无符号编码:基于传统的二进制表示法,表示大于或等于0的数字 补码:有符号整数的常见方式(可正可负) 浮点数:表示实...

  • 信息的表示和处理(2):整数表示

    精确定义如何编码和操作整数的数学术语: 1.1 整数数据类型 唯一一个与机器相关的类型是long,其他类型的取值范...

  • 1. 信息的表示和处理

    深入理解计算机系统,是从计算机的底层往上看,从下到上一层一层的分析。 在计算机中,使用二进制来表示最基本的单位,原...

  • 信息的处理与表示

    计算机以8位为一块(称作字节byte)作为最小的可寻址的内存单位。虚拟地址空间(virtual address s...

网友评论

      本文标题:Charpter Two 信息的表示和处理

      本文链接:https://www.haomeiwen.com/subject/lrntpxtx.html