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 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- 浅谈C语言转义字符和格式控制符
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C 语言简单加减乘除运算
- C语言自动生成enum值和名字映射代码
- 利用C语言的Cairo图形库绘制太极图实例教程
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方