CS:APP CP2 信息的表示和处理
数据的机器表示
- 大端法: 高位在前
- 小段法: 低位在前
C语言的移位操作
- 左移:直接左移右边补0
- 算数右移:右移时左边补最高位
- 逻辑右移:右移时左边补0
操作 | 值 |
---|---|
x | [10010] |
x << 3 | [10000] |
x >> 3(算数右移) | [11110] |
x >> 3(逻辑右移) | [00010] |
数据的三种码表示
原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原码是人脑最容易理解和计算的表示方式.反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.
C语言类型转换
C语言强制类型转换是改变了解释数字的位的解释方式,真实的位表示没有变化
当把 x
强制从int
转换成short
时,将高位截断。
整型运算与溢出
移位运算表示的乘除
乘以常数
例如要表示 x∗m- 当
m=2k
时,等价于
x << k
- 当
m
无法用
2k 来表示时,如 m=14 , 可以将 14表示成 14=24−21 ,此时用移位运算表示为(x << 4) - (x << 1)
(乘法运算可能导致溢出,但即使溢出,移位运算与表达式求值结果也是相同的)
- 当
m=2k
时,等价于
除以2的幂
除法不同于乘法,不能用移位运算表示任意常数的除法,只能除以2的幂- 当x > 0 或者为无符号数时,
x/2k
=
x >> 2
- 当x < 0,由于移位除法统一向下取整,而实际上x为负数时除法是向上取整,所以有
x/2k
=
(x + (1 << k) - 1) >> k
。
解释:对于任意整数x
和任意y > 0
,有 ⌈x/y⌉ = ⌊(x+y−1)/y⌋ .
- 当x > 0 或者为无符号数时,
x/2k
=