第2章 信息的表示和处理
文章目录
2.1 信息存储
2.1.1 十六进制表示法
- 二进制 (
i+4j,{i∈[0,3],j个0}
)<——>(4位一拆) 十六进制 (除16)<——>(乘16) 十进制
2.1.2 字数据大小
- 计算机字长w位(word size):指明指针数据的标称大小(nominal size), 决定虚拟地址空间大小0~$2^{w}-1$
2.1.3 寻址和字节顺序
- 多字节对象都被存储为连续的字节序列
- 小端法:最低有效字节在前面
- 大端法:最高有效字节在前面
- 字节顺序产生问题
- 不同机器通过网络传送二进制数据
- 阅读表示整数数据的字节序列
- 编写规避正常的类型系统的程序
2.1.7 C语言中的位级运算
- 掩码运算:从一个字中选出的位的集合。
x&0xFF
(可移植)
2.1.8 C语言中的逻辑运算
- 逻辑运算(
&&
、||
、!
) vs 位级运算(&
、|
、~
、^
):非零 -true
,0 -false
;短路
2.1.9 C语言中的移位运算
算术右移(补最高位)
逻辑右移(补0)
2.2 整数表示
2.2.4 有符号数和无符号数之间的转换
$0≤x≤TMax_w$ $T2U_w(x)=x$ $U2T_w(x)=x$
else $T2U_w(x)=x+2^w$ $U2T_w(x)=x-2^w$
2.2.6 扩展一个数字的位表示
无符号数的零扩展
补码数的符号扩展
2.2.7 截断数字
U2T(B2U % $2^k$)
2.3 整数运算
w位截断,s=x+y
2.3.1 无符号加法
$x+{^u_w}y= \begin{cases} x+y, & x+y<2^w & 正常 \ x+y-2^w, & 2^w≤x+y<2^{w+1} & 溢出 \end{cases}$
- 溢出:
s<x or s<y
- 求反:$-{^u_w}x= \begin{cases} x, & x=0 \ 2^w-x, & x>0 \end{cases}$
2.3.2 补码加法
$x+{^t_w}y= \begin{cases} x+y-2^w, & 2^{w-1}≤x+y & 正溢出 \ x+y, & -2^{w-1}≤x+y<2^{w-1} & 正常 \ x+y+2^w, & x+y<-2^{w-1} & 负溢出 \end{cases}$
- 溢出:x>0,y>0 s≤0 or x<0,y<0 s≥0
2.3.3 补码的非
$-{^t_w}x= \begin{cases} TMin_w, & x=TMin_w \ -x, & x>TMin_w \end{cases}$
- 位级表示
- 对每一位求补,再对结果加1
- 对位
k
左边的所有位取反(k
为最右边1的位置)
2.3.4 无符号乘法
$x*{^u_w}y=(x·y)mod 2^w$
2.3.5 补码乘法
$x*{^t_w}y=U2T_w((x·y)mod 2^w)$
2.3.6 乘以常数
$x*{^u_w}2^k,x*{^t_w}2^k$:
x<<k
2.3.7 除以2的幂
无符号,补码(向下舍入):
x>>k
补码(向上舍入):(x+(1<<k)-1)>>k
2.4 浮点数
2.4.1 二进制小数
- 二进制转小数:$b=\sum_{i=-n}^{m}2^i\times b_i$
- 小数($\frac{x}{2^k}$)转二进制:使用
x
的二进制表示,小数点插入右边k
位
2.4.2 IEEE浮点表示
$V=(-1)^s\times M\times 2^E$
- s(符号sign):1负0正
- M(尾数,n位,frac):二进制小数,
1~2-ε or 0~1-ε
- E(阶码exponent,k位,exp):权重$2^E$
- 32位:s=1、k=8、n=23
- 64位:s=1、k=11、n=52
情况1:规格化的值
exp≠0&≠255(双精度2047)
- Bias(偏置biased):$2^{k-1}-1$(单精度-126~127,双精度-1022~1023)
- e(无符号数):$e_{k-1}···e_1e_0$
- f(frac小数值):0≤f<1,$0.f_{n-1}···f_1f_0$
- E=e-Bias
- M=1+f
情况2:非规格化的值
exp=0
- E=1-Bias
- M=f
- 表示0
情况3:特殊值
exp=1:f=0(无穷),f≠0(NaN)
整数值转浮点形式
- 将二进制小数左移
- 丢弃开头的1,得到小数部分f
- e=E+Bias
2.4.4 舍入
- 向偶数舍入
- 向零舍入
- 向下舍入
- 向上舍入
2.4.5 浮点运算
- 不具有结合性、分配性