CS-APP CP2 信息的表示和处理

来源:互联网 发布:大富豪3.5源码下载 编辑:程序博客网 时间:2024/06/08 02:12

CS:APP CP2 信息的表示和处理


数据的机器表示

  • 大端法: 高位在前
  • 小段法: 低位在前

C语言的移位操作

  • 左移:直接左移右边补0
  • 算数右移:右移时左边补最高位
  • 逻辑右移:右移时左边补0
操作 值 x [10010] x << 3 [10000] x >> 3(算数右移) [11110] x >> 3(逻辑右移) [00010]

数据的三种码表示

  1. 原码
    原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
    [+1]原 = 0000 0001
    [-1]原 = 1000 0001
    第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
    [1111 1111 , 0111 1111]

    [-127 , 127]
    原码是人脑最容易理解和计算的表示方式.

  2. 反码
    反码的表示方法是:
    正数的反码是其本身
    负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
    [+1] = [00000001]原 = [00000001]反
    [-1] = [10000001]原 = [11111110]反
    可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.

  3. 补码
    补码的表示方法是:
    正数的补码就是其本身
    负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
    [+1] = [00000001]原 = [00000001]反 = [00000001]补
    [-1] = [10000001]原 = [11111110]反 = [11111111]补
    对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

C语言类型转换

C语言强制类型转换是改变了解释数字的位的解释方式,真实的位表示没有变化
当把 x强制从int转换成short时,将高位截断。

整型运算与溢出

参考此篇文章

移位运算表示的乘除

  1. 乘以常数
    例如要表示 xm

    • m=2k 时,等价于 x << k
    • m 无法用 2k 来表示时,如 m=14, 可以将 14表示成 14=2421,此时用移位运算表示为(x << 4) - (x << 1)
      (乘法运算可能导致溢出,但即使溢出,移位运算与表达式求值结果也是相同的)
  2. 除以2的幂
    除法不同于乘法,不能用移位运算表示任意常数的除法,只能除以2的幂

    • 当x > 0 或者为无符号数时,x/2k = x >> 2
    • 当x < 0,由于移位除法统一向下取整,而实际上x为负数时除法是向上取整,所以有 x/2k = (x + (1 << k) - 1) >> k
      解释:对于任意整数 x和任意 y > 0,有x/y = (x+y1)/y.
0 0
原创粉丝点击