计算机系统基础(一)——程序的表示、转换与链接

原码&移码&补码

  1. 原码
    • 最高位放符号位,1 表示负
    • 定点小数,用来表示浮点数的尾数
  2. 移码
    • 真值加上一个偏置值 bias, bias 常为 2n - 1 or 2n - 1 - 1 (如 IEEE 754)
    • 定点整数,用来表示浮点数的阶
    • 移码的本意是为了方便两个数作比较
  3. 补码
    • 假设补码有 n 位,则:x = 2n + x
    • 数值为正数时,其值大小就是原码;为负时,其值的大小就是各位取反再加 1
    • 补码表示带符号整数
    • 补码的出现是为了解决计算机的减法运算问题
    • 求补码的真值——简便求法
      • 符号为 0 ,则为正数,数值部分相同
      • 符号为 1,则为负数,数值各位取反,末位加 1
  • 各位取反,末位加 1 简便做法:从后往前看,找到第一个 1 ,将它前面的所有位取反

浮点数—— IEEE754 标准

  • 数符 + 阶码 + 尾数
    • Float 1 + 8 + 23
      • SP : (-1) s * (1 + Significand) * 2 (Exponent - 127)
    • Double 1 + 11 + 52
      • DP : (-1) s * (1 + Significand) * 2 (Exponent - 1023)
  1. 数符 Sign bit
    • 1 表示负数
  2. 阶码 Exponent
    • 规格化阶码范围为 0000 0001(-126) —— 1111 1110(127) (single)
    • bias 为 127(single) 1023(double)
    • 规格化阶范围为 1——254 (single)
    • 全 0 和全 1 用来表示特殊值
    • 为避免混淆,用阶码表示阶的编码,用阶或指数表示阶码的值
  3. 尾数 Significand
    • 规格化尾数最高位总是 1 ,所以隐含表示,省 1 位,小数点前总是 1
  • 特殊数的表示 (single)
    • 0
      • 阶码:all zeros
      • 尾数:all zeros
      • +0:0 00000000 00000000000000000000000
      • -0:1 00000000 00000000000000000000000
      • 阶码:all ones
      • 尾数:all zeros
      • +∞:0 11111111 00000000000000000000000
      • -∞:1 11111111 00000000000000000000000
      • 浮点数除以 0 的结果是 ∞ ,而不是溢出异常(整数除以 0 为异常)
    • NaN ( Not a Number )
      • 阶码:all ones
      • 尾数:nonzeros
      • 可帮助调试程序
    • 非规格化数 Denorms
      • 阶码:all zeros
      • 尾数:nonzeros
      • 用于表示 0 与规格化数间的 Gap
      • SP : (-1) s * (0.xxxx…xxx) * 2 -126
      • 为了让非规格化单精度浮点数能够平缓过渡到规格化单精度浮点数,所以取 2 -126
      • 当输入数据为不可表示数时,机器将其转换为最邻近的可表示数

汉字内码&ASCII码

  • ASCII码为 7 位编码
  • Ex:汉字 " 大 " 在码表中位于第 20 行、第 83 列。因此区位码为 0010100 1010011 ,在区、位码上各加 32 得到两个字节编码(GB2312国标码),即 00110100 01110011B = 3473H 。前面的 34 H 和 字符 4 的 ACSII 的最高位相同,后面的 73H 和字符 s 的 ACSII 码相同。但是,将每个字节的最高位各设为 1 后,就得到其内码: B4F3H ( 0110100 11110011B ),因而不会和 ASCII 码混淆

逻辑电路

  • 异或: n 个数做异或运算,若有奇数个 1 ,则输出 1

推荐阅读

  1. # 原码、反码、补码