您的位置:首页 > 移动开发

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

2017-01-11 11:47 337 查看

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)


(乘法运算可能导致溢出,但即使溢出,移位运算与表达式求值结果也是相同的)

除以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⌋.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言