0. 简介
介绍计算机中数的表示方法,主要内容来自 c s a p p csapp csapp。
1. 整数的表示
包括有符号整数与无符号整数的表示。
假设
w
→
=
[
w
n
−
1
w
n
−
2
.
.
.
w
0
]
\overrightarrow w=[w_{n-1}w_{n-2}...w_0]
w=[wn−1wn−2...w0]
为一种整数。
1.1 无符号整数
计算机是二进制的,且数据长度固定。
所以无符号二进制数实际上直接表示即可。
B 2 U ( w → ) = ∑ i = 0 n − 1 w i × 2 i B2U(\overrightarrow w)=\sum_{i=0}^{n-1}w_i \times 2^{i} B2U(w)=i=0∑n−1wi×2i
1.2 有符号整数
-
补码编码
最高位来表示符号位
B 2 T ( w → ) = − w n − 1 ∗ 2 n − 1 + ∑ i = 0 n − 2 w i × 2 i B2T(\overrightarrow w)=-w_{n-1}*2^{n-1}+\sum_{i=0}^{n-2}w_i\times2^i B2T(w)=−wn−1∗2n−1+i=0∑n−2wi×2i
所以范围为有符号整数范围为 − 2 n − 1 ∼ 2 n − 1 − 1 -2^{n-1}\sim 2^{n-1}-1 −2n−1∼2n−1−1 -
反码编码
B 2 O ( w → ) = − w n − 1 ∗ ( 2 n − 1 − 1 ) + ∑ i = 0 n − 2 w i × 2 i B2O(\overrightarrow w)=-w_{n-1}*(2^{n-1}-1)+\sum_{i=0}^{n-2}w_i\times2^i B2O(w)=−wn−1∗(2n−1−1)+i=0∑n−2wi×2i -
原码编码
B 2 S ( w → ) = ( − 1 ) w n − 1 ⋅ ∑ i = 0 n − 2 w i × 2 i B2S(\overrightarrow w)=(-1)^{w_{n-1}} \cdot \sum_{i=0}^{n-2}w_i \times2^i B2S(w)=(−1)wn−1⋅i=0∑n−2wi×2i
为什么使用补码?原码和反码的表示中,对于 0 0 0的表示有歧义。 + 0 ( 0000 0000 ) +0(0000\ 0000) +0(0000 0000), − 0 ( 1000 0000 ) -0(1000\ 0000) −0(1000 0000)
1.3 有符号数与无符号数间转换
无符号数转有符号数
B
2
U
(
w
→
)
=
∑
i
=
0
n
−
1
w
i
×
2
i
=
w
n
−
1
∗
2
n
−
1
+
∑
i
=
0
n
−
2
w
i
×
2
i
B
2
T
(
w
→
)
=
−
w
n
−
1
∗
2
n
−
1
+
∑
i
=
0
n
−
2
w
i
×
2
i
\begin{align} B2U(\overrightarrow w)=\sum_{i=0}^{n-1}w_i \times 2^i=w_{n-1} *2^{n-1} +\sum_{i=0}^{n-2}w_i \times 2^i\\ B2T(\overrightarrow w)=-w_{n-1}*2^{n-1}+\sum_{i=0}^{n-2}w_i\times2^i \end{align}
B2U(w)=i=0∑n−1wi×2i=wn−1∗2n−1+i=0∑n−2wi×2iB2T(w)=−wn−1∗2n−1+i=0∑n−2wi×2i
(
2
)
−
(
1
)
(2)-(1)
(2)−(1)得到
B
2
T
(
w
→
)
−
B
2
U
(
w
→
)
=
−
w
n
−
1
∗
2
n
B2T(\overrightarrow w)-B2U(\overrightarrow w)=-w_{n-1} *2^{n}
B2T(w)−B2U(w)=−wn−1∗2n
所以
U
2
T
(
w
→
)
=
−
w
n
−
1
∗
2
n
+
B
2
U
(
w
→
)
U2T(\overrightarrow w)=-w_{n-1}*2^n+B2U(\overrightarrow w)
U2T(w)=−wn−1∗2n+B2U(w)
分类讨论下最高位情况
l
e
t
u
=
B
2
U
(
w
→
)
U
2
T
(
u
)
=
{
u
,
u
≤
T
M
a
x
n
(
w
n
−
1
=
1
)
u
−
2
n
,
u
>
T
M
a
x
n
let\ u=B2U(\overrightarrow{w})\\ \begin{equation} U2T(u )= \begin{cases} u,\quad u \le TMax_{n}(w_{n-1} =1)\\ u-2^n,\quad u \gt TMax_{n} \end{cases} \end{equation}
let u=B2U(w)U2T(u)={u,u≤TMaxn(wn−1=1)u−2n,u>TMaxn
同理可得有符号转无符号数
B
2
U
(
w
→
)
=
U
2
T
(
w
→
)
+
w
n
−
1
∗
2
n
B2U(\overrightarrow w)=U2T(\overrightarrow w)+w_{n-1}*2^n
B2U(w)=U2T(w)+wn−1∗2n
同样分类讨论最高位情况
l
e
t
t
=
U
2
T
(
w
→
)
T
2
U
(
t
)
=
{
t
,
t
≥
0
)
t
+
2
n
,
t
<
0
let\ t=U2T(\overrightarrow w)\\ \begin{equation} T2U(t)= \begin{cases} t,\quad t \ge 0)\\ t+2^n,\quad t \lt 0 \end{cases} \end{equation}
let t=U2T(w)T2U(t)={t,t≥0)t+2n,t<0
1.4 数位扩展
无符号数扩展,直接在前面添加 0 0 0即可。
u
→
=
[
u
n
−
1
u
n
−
2
⋯
u
0
]
u
′
→
=
[
0
⋯
u
n
−
1
⋯
u
0
]
\overrightarrow u=[u_{n-1}u_{n-2}\cdots u_0]\\ \overrightarrow {u'}= [0\cdots u_{n-1}\cdots u_0]
u=[un−1un−2⋯u0]u′=[0⋯un−1⋯u0]
根据
B
2
U
(
w
→
)
=
∑
i
=
0
n
−
1
w
i
×
2
i
B2U(\overrightarrow w)=\sum_{i=0}^{n-1}w_i \times 2^{i}
B2U(w)=i=0∑n−1wi×2i
u
→
=
u
′
→
\overrightarrow {u}=\overrightarrow{u'}
u=u′
补码符号扩展,在前面不断添加最高位数字即可
证明
B
2
T
t
+
k
(
[
w
t
−
1
w
t
−
1
w
t
−
2
⋯
w
0
]
)
=
−
2
t
+
k
−
1
∗
w
n
−
1
+
∑
i
=
0
t
+
k
−
2
2
i
∗
w
i
=
−
2
t
+
k
−
1
∗
w
t
−
1
+
2
t
+
k
−
2
∗
w
t
−
1
+
∑
i
=
0
t
+
k
−
3
2
i
∗
w
i
=
−
2
t
+
k
−
2
∗
w
t
−
1
+
∑
i
=
0
t
+
k
−
3
2
i
∗
w
i
⋯
=
−
2
t
−
1
∗
w
t
−
1
+
∑
i
=
0
t
−
2
2
i
∗
w
i
=
B
2
T
t
(
w
t
−
1
w
t
−
2
⋯
w
0
)
\begin{align} B2T_{t+k}([w_{t-1}w_{t-1}w_{t-2}\cdots w_0]) &= -2^{t+k-1}*w_{n-1}+\sum_{i=0}^{t+k-2}2^{i} *w_i \nonumber\\ &= -2^{t+k-1}*w_{t-1}+2^{t+k-2}*w_{t-1}+\sum_{i=0}^{t+k-3}2^{i} *w_i \nonumber\\ &=-2^{t+k-2}*w_{t-1}+\sum_{i=0}^{t+k-3}2^{i} *w_i \nonumber\\ &\cdots \nonumber \\ &=-2^{t-1} *w_{t-1} + \sum_{i=0}^{t-2}2^{i} *w_i \nonumber \\ &= B2T_{t}(w_{t-1}w_{t-2}\cdots w_0) \nonumber \end{align}
B2Tt+k([wt−1wt−1wt−2⋯w0])=−2t+k−1∗wn−1+i=0∑t+k−22i∗wi=−2t+k−1∗wt−1+2t+k−2∗wt−1+i=0∑t+k−32i∗wi=−2t+k−2∗wt−1+i=0∑t+k−32i∗wi⋯=−2t−1∗wt−1+i=0∑t−22i∗wi=B2Tt(wt−1wt−2⋯w0)
1.5 数位截断
无符号数的截断,直接取 k k k位即可。
证明
B
2
U
t
(
[
w
t
−
1
w
t
−
2
⋯
w
0
]
)
m
o
d
2
k
=
[
∑
i
=
0
t
−
1
w
i
∗
2
i
]
m
o
d
2
k
=
[
∑
i
=
0
k
−
1
w
i
∗
2
i
]
m
o
d
2
k
=
[
∑
i
=
0
k
−
1
w
i
∗
2
i
]
=
B
2
U
k
(
w
k
−
1
w
k
−
2
⋯
w
0
)
\begin{align} B2U_t([w_{t-1}w_{t-2}\cdots w_0]) \bmod 2^k &=[\sum_{i=0}^{t-1}w_i *2^i] \bmod 2^k \nonumber\\ &= [\sum_{i=0}^{k-1}w_i *2^i] \bmod 2^k \nonumber\\ &= [\sum_{i=0}^{k-1}w_i *2^i] \nonumber\\ &= B2U_k(w_{k-1}w_{k-2} \cdots w_0)\nonumber\\ \end{align}
B2Ut([wt−1wt−2⋯w0])mod2k=[i=0∑t−1wi∗2i]mod2k=[i=0∑k−1wi∗2i]mod2k=[i=0∑k−1wi∗2i]=B2Uk(wk−1wk−2⋯w0)
利用了
∀
i
>
=
k
,
2
i
m
o
d
2
k
=
0
\forall i>=k, 2^i \bmod2^k=0
∀i>=k,2imod2k=0
有符号数(补码)的截断
B
2
T
t
(
[
w
t
−
1
w
t
−
2
⋯
w
0
]
)
m
o
d
2
k
=
U
2
T
t
(
B
2
U
t
(
[
w
t
−
1
w
t
−
2
⋯
w
0
]
)
)
m
o
d
2
k
l
e
t
u
=
B
2
U
t
(
[
w
t
−
1
w
t
−
2
⋯
w
0
]
)
根据公式
(
3
)
=
[
u
−
(
i
×
2
t
)
]
m
o
d
2
k
=
u
m
o
d
2
k
=
U
2
T
t
(
B
2
U
t
(
[
w
t
−
1
w
t
−
2
⋯
w
0
]
)
m
o
d
2
k
)
\begin{align} B2T_t([w_{t-1}w_{t-2}\cdots w_0]) \bmod 2^k&= U2T_t(B2U_t([w_{t-1}w_{t-2}\cdots w_0])) \bmod 2^k \nonumber \\ &let\ u =B2U_t([w_{t-1}w_{t-2}\cdots w_0])\nonumber \\ 根据公式(3)\nonumber \\ &=[u-(i \times 2^{t})] \bmod 2^k\nonumber \\ &= u \bmod 2^k\nonumber\\ &= U2T_t(B2U_t([w_{t-1}w_{t-2}\cdots w_0])\bmod 2^k) \nonumber \\ \end{align}
B2Tt([wt−1wt−2⋯w0])mod2k根据公式(3)=U2Tt(B2Ut([wt−1wt−2⋯w0]))mod2klet u=B2Ut([wt−1wt−2⋯w0])=[u−(i×2t)]mod2k=umod2k=U2Tt(B2Ut([wt−1wt−2⋯w0])mod2k)
2. 整数的运算
2.1 整数加法
无符号整数加法
∀ x , y , 0 ≤ x , y < 2 w x + w u y = { x + y , x + y < 2 w x + y − 2 w , 2 w ≤ x + y < 2 w + 1 ( 溢出 ) \forall x,y, 0 \le x,y\lt2^w\\ x+^{u}_{w}y= \begin{cases} x+y, \quad x+y \lt 2^w\\ x+y-2^w,\quad 2^{w} \le x+y \lt 2^{w+1}(溢出) \end{cases} ∀x,y,0≤x,y<2wx+wuy={x+y,x+y<2wx+y−2w,2w≤x+y<2w+1(溢出)
检测无符号数
∀
x
,
y
,
0
≤
x
,
y
<
2
w
l
e
t
s
=
x
+
w
u
y
,
s
<
x
则发生溢出。
溢出时,
x
+
w
u
y
=
x
+
y
−
2
w
x
,
y
<
2
w
y
−
2
w
<
0
,
x
−
2
w
<
0
x
+
y
−
2
w
<
x
,
y
+
x
−
2
w
<
y
\forall x,y, 0 \le x,y\lt2^w\\ let\ s=x+^{u}_wy,s<x则发生溢出。\\ 溢出时,x+^{u}_wy=x+y-2^w\\ x,y \lt 2^w\\ y-2^{w} \lt 0,x-2^w \lt 0\\ x+y-2^w \lt x,y+x-2^w \lt y
∀x,y,0≤x,y<2wlet s=x+wuy,s<x则发生溢出。溢出时,x+wuy=x+y−2wx,y<2wy−2w<0,x−2w<0x+y−2w<x,y+x−2w<y
无符号数求反
−
w
u
x
=
{
0
,
x
=
0
2
w
−
x
,
x
≠
0
-^u_wx= \begin{cases} 0, \quad x=0\\ 2^w-x, x \ne 0 \end{cases}
−wux={0,x=02w−x,x=0
补码加法
∀
x
,
y
,
−
2
w
−
1
≤
x
,
y
≤
2
w
−
1
−
1
x
+
w
t
y
=
{
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
\forall x,y, -2^{w-1} \le x, y \le 2^{w-1} -1\\ x+^{t}_{w}y= \begin{cases} x+y-2^w, \quad 2^{w-1}\le x+y\\ x+y,\quad -2^{w-1} \le x+y \le 2^{w-1}\\ x+y+2^{w},\quad x+y\le -2^{w-1} \end{cases}
∀x,y,−2w−1≤x,y≤2w−1−1x+wty=⎩
⎨
⎧x+y−2w,2w−1≤x+yx+y,−2w−1≤x+y≤2w−1x+y+2w,x+y≤−2w−1
由于补码表示与无符号位表示相似
则我们可以转换为无符号再进行计算
x
+
w
t
y
=
U
2
T
w
(
T
2
U
w
(
x
)
+
T
2
U
w
(
y
)
)
=
U
2
T
w
[
(
x
w
−
1
2
w
+
x
+
y
w
−
1
2
w
+
y
)
m
o
d
2
w
]
=
U
2
T
w
[
(
x
+
y
)
m
o
d
2
w
]
\begin{align} x+^t_wy&= U2T_w(T2U_w(x)+T2U_w(y)) \nonumber \\ &= U2T_w[(x_{w-1}2^w+x+y_{w-1}2^w+y) \bmod 2^w]\nonumber \\ &= U2T_w[(x+y) \bmod 2^w]\nonumber \\ \end{align}
x+wty=U2Tw(T2Uw(x)+T2Uw(y))=U2Tw[(xw−12w+x+yw−12w+y)mod2w]=U2Tw[(x+y)mod2w]
检测补码加法中的溢出
s
=
x
+
w
t
y
x
>
0
,
y
>
0
,
s
≤
0
,
正溢出
x
<
0
,
y
<
0
,
s
≥
0
负溢出
s=x+^t_wy\\ x \gt 0, y \gt 0,s\le0,正溢出\\ x \lt 0,y\lt 0,s \ge 0负溢出
s=x+wtyx>0,y>0,s≤0,正溢出x<0,y<0,s≥0负溢出
补码的非
−
w
t
x
=
{
T
m
i
n
w
,
x
=
T
m
i
n
w
−
x
,
x
>
T
m
i
n
w
-^t_wx = \begin{cases} Tmin_w, \quad x=Tmin_w\\ -x,\quad x \gt Tmin_w \end{cases}
−wtx={Tminw,x=Tminw−x,x>Tminw
2.2 整数乘法
无符号乘法
x
∗
w
u
y
=
(
x
∗
y
)
m
o
d
2
w
x * ^u_wy=(x*y) \bmod 2^w
x∗wuy=(x∗y)mod2w
补码乘法
x ∗ w t y = U 2 T w ( ( x ∗ y ) m o d 2 w ) x * ^t_wy=U2T_w((x*y) \bmod 2^w) x∗wty=U2Tw((x∗y)mod2w)
证明
T
2
B
w
(
x
∗
w
t
y
)
=
U
2
B
w
(
x
′
∗
w
t
y
′
)
x
′
=
x
+
x
w
−
1
2
w
y
′
=
y
+
y
w
−
1
w
w
(
x
′
∗
y
′
)
m
o
d
2
w
=
(
x
+
x
w
−
1
2
w
)
(
y
+
y
w
−
1
2
w
)
m
o
d
2
w
=
(
x
y
)
m
o
d
2
w
T2B_w(x*^t_wy)=U2B_w(x'*^t_wy')\\ x' = x +x_{w-1}2^w\\ y' = y+y_{w-1}w^w\\ (x' * y') \bmod 2^w= (x +x_{w-1}2^w)(y+y_{w-1}2^w) \bmod 2^w=(xy) \bmod 2^w
T2Bw(x∗wty)=U2Bw(x′∗wty′)x′=x+xw−12wy′=y+yw−1ww(x′∗y′)mod2w=(x+xw−12w)(y+yw−12w)mod2w=(xy)mod2w
乘以2的
k
k
k次幂,左移
k
k
k位
B
2
U
w
+
k
(
[
x
w
−
1
x
w
−
2
⋯
0
]
)
=
∑
i
=
0
w
−
1
x
i
2
i
+
k
=
[
∑
i
=
0
w
−
1
x
i
2
i
]
×
2
k
=
x
2
k
B2U_{w+k}([x_{w-1}x_{w-2}\cdots 0]) = \sum_{i=0}^{w-1}x_i2^{i+k}=[\sum_{i=0}^{w-1}x_i2^i]\times2^k=x2^k
B2Uw+k([xw−1xw−2⋯0])=i=0∑w−1xi2i+k=[i=0∑w−1xi2i]×2k=x2k
3. 浮点数
3.1 浮点数表示
V
=
(
−
1
)
s
×
M
×
2
E
V=(-1)^s\times M \times2^E
V=(−1)s×M×2E
在内存中的布局
E
=
e
−
B
i
a
s
e
=
B
2
U
(
e
k
−
1
e
k
−
2
⋯
e
0
)
B
i
a
s
=
2
k
−
1
−
1
f
=
B
2
U
(
[
f
n
−
1
f
n
−
2
⋯
f
0
]
)
/
2
n
E=e-Bias\\ e=B2U(e_{k-1}e_{k-2}\cdots e_0)\\ Bias=2^{k-1}-1\\ f=B2U([f_{n-1}f_{n-2} \cdots f_0])/2^{n}
E=e−Biase=B2U(ek−1ek−2⋯e0)Bias=2k−1−1f=B2U([fn−1fn−2⋯f0])/2n
总体分三种情况
- 标准化值
阶码部分不全为0或不全为1
M = 1 + f M=1+f M=1+f - 非标准化值
阶码部分全为0
M = f M=f M=f - 特殊值
阶码全为1,小数域全为0,对应 − ∞ , + ∞ -\infin ,+\infin −∞,+∞,
小数域非0,对应 N a N NaN NaN,表示不是一个数。