计算机中数的表示

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 =[wn1wn2...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=0n1wi×2i

1.2 有符号整数
  1. 补码编码
    最高位来表示符号位
    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 )=wn12n1+i=0n2wi×2i
    所以范围为有符号整数范围为 − 2 n − 1 ∼ 2 n − 1 − 1 -2^{n-1}\sim 2^{n-1}-1 2n12n11

  2. 反码编码
    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 )=wn1(2n11)+i=0n2wi×2i

  3. 原码编码
    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)wn1i=0n2wi×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=0n1wi×2i=wn12n1+i=0n2wi×2iB2T(w )=wn12n1+i=0n2wi×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 )=wn12n
所以
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 )=wn12n+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,uTMaxn(wn1=1)u2n,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 )+wn12n
同样分类讨论最高位情况
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,t0)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 =[un1un2u0]u =[0un1u0]
根据
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=0n1wi×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([wt1wt1wt2w0])=2t+k1wn1+i=0t+k22iwi=2t+k1wt1+2t+k2wt1+i=0t+k32iwi=2t+k2wt1+i=0t+k32iwi=2t1wt1+i=0t22iwi=B2Tt(wt1wt2w0)

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([wt1wt2w0])mod2k=[i=0t1wi2i]mod2k=[i=0k1wi2i]mod2k=[i=0k1wi2i]=B2Uk(wk1wk2w0)
利用了
∀ 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([wt1wt2w0])mod2k根据公式(3)=U2Tt(B2Ut([wt1wt2w0]))mod2klet u=B2Ut([wt1wt2w0])=[u(i×2t)]mod2k=umod2k=U2Tt(B2Ut([wt1wt2w0])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,0x,y<2wx+wuy={x+y,x+y<2wx+y2w,2wx+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,0x,y<2wlet s=x+wuys<x则发生溢出。溢出时,x+wuy=x+y2wx,y<2wy2w<0,x2w<0x+y2w<x,y+x2w<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=02wx,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,2w1x,y2w11x+wty= x+y2w,2w1x+yx+y,2w1x+y2w1x+y+2w,x+y2w1
由于补码表示与无符号位表示相似

则我们可以转换为无符号再进行计算

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[(xw12w+x+yw12w+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,s0,正溢出x<0,y<0,s0负溢出
补码的非
− 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=Tminwx,x>Tminw

2.2 整数乘法

无符号乘法
x = B 2 U w ( x → ) , y = B 2 U w ( y → ) , x ∗ w u y = ( x ∗ y )   m o d   2 w x=B2U_w(\overrightarrow x),y=B2U_w(\overrightarrow y),\\ x * ^u_wy=(x*y) \bmod 2^w x=B2Uw(x ),y=B2Uw(y ),xwuy=(xy)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) xwty=U2Tw((xy)mod2w)

证明
x ′ = B 2 T w ( x → ) , y ′ = B 2 T w ( y → ) 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 2 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 x'=B2T_w(\overrightarrow x),y'=B2T_w(\overrightarrow y )\\ T2B_w(x*^t_wy)=U2B_w(x'*^t_wy')\\ x' = x +x_{w-1}2^w\\ y' = y+y_{w-1}2^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 x=B2Tw(x ),y=B2Tw(y )T2Bw(xwty)=U2Bw(xwty)x=x+xw12wy=y+yw12w(xy)mod2w=(x+xw12w)(y+yw12w)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([xw1xw20])=i=0w1xi2i+k=[i=0w1xi2i]×2k=x2k

2.3 整数除法

无符号数除2^k

x = B 2 U w ( x → ) = B 2 U w ( x w − 1 x w − 2 . . . x 0 ) x ′ = B 2 U w − k ( x w − 1 ⋯ x k ) x ′ ′ = B 2 U k ( x k − 1 ⋯ x 0 ) x = x ′ ∗ 2 k + x ′ ′ ⌊ x / 2 k ⌋ = x > > k x = B2U_w(\overrightarrow x)=B2U_w(x_{w-1}x_{w-2}...x_{0})\\ x'=B2U_{w-k}(x_{w-1}\cdots x_{k})\\ x''=B2U_{k}(x_{k-1\cdots x_0})\\ x=x'*2^k+x''\\ \lfloor x /2^k \rfloor =x >>k x=B2Uw(x )=B2Uw(xw1xw2...x0)x=B2Uwk(xw1xk)x′′=B2Uk(xk1x0)x=x2k+x′′x/2k=x>>k
补码除2^k

x = B 2 T w ( x → ) = B 2 T w ( x w − 1 x w − 2 ⋯ x 0 ) x ′ = B 2 T w − k ( x w − 1 x w − 2 ⋯ x k ) x ′ ′ = B 2 U k ( x k − 1 x k − 2 ⋯ x 0 ) 易得 x = 2 k x ′ + x ′ ′ ; 0 ≤ x ′ ′ < 2 k x ′ = ⌊ x 2 k ⌋ x=B2T_w(\overrightarrow x)=B2T_w(x_{w-1}x_{w-2}\cdots x_0)\\ x'=B2T_{w-k}(x_{w-1}x_{w-2}\cdots x_k)\\ x'' =B2U_k(x_{k-1}x_{k-2} \cdots x_0)\\ 易得x=2^kx'+x''; 0 \le x'' \lt 2^k\\ x'=\lfloor \frac{x}{2^k} \rfloor x=B2Tw(x )=B2Tw(xw1xw2x0)x=B2Twk(xw1xw2xk)x′′=B2Uk(xk1xk2x0)易得x=2kx+x′′;0x′′<2kx=2kx
x x x扩展到 w w w
[ x w − 1 x w − 1 ⋯ x w − 1 x w − 2 ⋯ x 0 ] [x_{w-1}x_{w-1}\cdots x_{w-1} x_{w-2}\cdots x_0] [xw1xw1xw1xw2x0]

向上取整
⌈ x / y ⌉ = ⌊ ( x + y − 1 ) / y ⌋ \lceil x/y\rceil = \lfloor (x+y-1)/y \rfloor x/y=⌊(x+y1)/y
证明
l e t   x = q y + r , 0 ≤ r < y x + y − 1 = q y + r + y − 1 y − 1 ≤ r + y − 1 < 2 y − 1 r = 0 , ( x + y − 1 ) / y = q ; 1 ≤ r < y , ( x + y − 1 ) / y = q + 1 let\ x =qy+r, 0\le r \lt y\\ x+y-1 = qy+r+y-1\\ y -1 \le r+y-1 \lt 2y-1\\ r =0, (x+y-1)/y=q;\\ 1 \le r \lt y,(x+y-1)/y =q+1 let x=qy+r,0r<yx+y1=qy+r+y1y1r+y1<2y1r=0,(x+y1)/y=q;1r<y,(x+y1)/y=q+1

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=eBiase=B2U(ek1ek2e0)Bias=2k11f=B2U([fn1fn2f0])/2n
总体分三种情况

  1. 标准化值
    阶码部分不全为0或不全为1
    M = 1 + f M=1+f M=1+f
  2. 非标准化值
    阶码部分全为0
    M = f M=f M=f
  3. 特殊值
    阶码全为1,小数域全为0,对应 − ∞ , + ∞ -\infin ,+\infin ,+,
    小数域非0,对应 N a N NaN NaN,表示不是一个数。

UDP

  • 2024/4/27 补充整数除法部分内容(补码除2的整次幂)
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值