原码
- 定点小数:\([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\)