博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

组成原理-数值的编码表示

Posted on 2023-03-20 21:33  乔55  阅读(49)  评论(0编辑  收藏  举报

原码

  • 定点小数:\([x]_{原}= \begin{cases} x& 0 \leq x < 1 \\ 1-x=1+\left|{x}\right| & -1<x\leq 0 \end{cases}\)
  • 定点整数:\([x]_{原}= \begin{cases} x& 0 \leq x < 2^{n-1} \\ 2^{n-1}-x=2^{n-1}+\left|{x}\right| & -2^{n-1}<x\leq 0 \end{cases}\)

补数

  • 减去一个数y,等于加上这个数对模的补数K-y:\(x-y=x+K-y\)
  • 结论:减去一个小于模的数y,等于加上-y的补码

补码

  • 补码定义:\([x]_{补码}=K+x=K-|x|,[x]_{补码}是以K为模的x的补码\)
  • n位纯小数的模:最大的编号值末位加1得到模:\(K=2,\underbrace{1.11 \cdots 1}_{n个1}+\underbrace{0.00\cdots}_{(n-1)个0}1=2\)
  • n位纯整数的模
  • 定点小数补码:

\[[x]_{补}= \begin{cases} x& 0 \leq x < 1 & \\ 2-x=2+\left|{x}\right| & -1\leq x\leq 0 \end{cases} \]

  • n位定点整数的补码

\[[x]_{补}= \begin{cases} x& 0 \leq x < 2^{n-1} & K=2^{n-1}\\ 2^{n-1}-x=2^{n-1}+\left|{x}\right| & -2^{n-1}\leq x\leq 0 \end{cases} \]

  • 补码的范围:\(定点整数:x \in[-2^{n-1},2^{n-1}-1],定点小数:x \in [-1,1-2^{-(n-1)})\)

补码的移位运算

  • 逻辑左移:整体左移,末位补0
  • 算术左移:整体左移,末位补0
  • 逻辑右移:整体右移,高位补0
  • 算术右移:小数点不变,整体右移,高位填充符号位:\(1.0000000 \Rightarrow 1.1000000\)

求补码的方法举例

  • 设机器字长为8位,即其表示的真值范围为[128,127]
  • 边界数的补码:
    • \([-128]_{补}=1000,0000\)
    • \([-1]_{补}=1111,1111\)
    • \([0]_{补}=0000,0000\)
    • \([127]_{补}=0111,1111\)
  • 结论1:\(0 \Rightarrow 127 \Rightarrow -128 \Rightarrow -1\)补码从00000000向11111111增长
  • 结论2:负数补码的编码值大于正数补码的编码值
  • 结论3:n位全1编码减去x,相当于对x按位取反:\(11111111-x_0x_1x_2x_3x_4x_5x_6x_7=\overline{x_0}, \overline{x_1}, \overline{x_2}, \overline{x_3}, \overline{x_4}, \overline{x_5}, \overline{x_6}, \overline{x_7}\)
  • 负数x的补码等于x的绝对值的原码按位取反末位加1(包括符号位一起运算)
    \([x]_{补}=K-|x|=\underbrace{\overbrace{1.11\dots1}^{n个1}-{|X|}}_{相当于|X|按位取反}+\underbrace{\overbrace{000\dots0}^{(n-1)个0}1}_{末位加1}\)
  • 给出x的补码\([x]_{补}\),求x真值
    • \(|x|=K-[x]_{补}\),得出x绝对值,看其补码符号位即可得出x真值
    • \([X]_补=2+X,\Rightarrow -X=2-[X]_{补码},\Rightarrow|X|=-X=2-[X]_{补码}\)
    • \(|X|=2-[X]_{补码}= \underbrace{\overbrace{1.11\dots1}^{n个1}-{[X]_{补码}}}_{相当于[X]_{补码}按位取反}+\underbrace{\overbrace{0.00\dots0}^{(n-1)个0}1}_{末位加1}\)
  • 给定负数x的原码,如何快速求x补码:从原码右边往左边起,遇到第1个1时,1及右边的位均不变,左边按位取反即可。符号位不参与运算
    • \([x]_{原}=1,x_1,x_2,x_3,x_4,1_5,0_6,0_7\)
    • \([x]_{反}=1,\overline{x_1},\overline{x_2},\overline{x_3},\overline{x_4},0_5,1_6,1_7,然后末位加1,得以下结果:\)
    • \([x]_{补}=1,\overline{x_1},\overline{x_2},\overline{x_3},\overline{x_4},1_5,0_6,0_7\)