12定点数的表示[超大章]

定点数

$$
\left{
\begin{array}{c}
&定点数:小数的位置固定 \
&比如996.007\
\
&浮点数:小数的位置不固定\
&比如9.96007*10^2\
\end{array}
\right.
$$

总览

总览

无符号数的表示

无符号数:整个机器字长的全部:二进制位均为数值位,没有符号位,相当于数的绝对值。比如:

$$
\begin{align}
&10011100B\
&=12^7 +026+0*25+124+1*23+122+0*21+0*2^0\
&=156D
\end{align}
$$

2的次方数

一个8位数的二进制数能够表达出28种不同的状态
1~256,但是我们计算机是从0开始计数,于是我们表示为0~255

n位的无符号数表示范围为:$[0,2n-1]\text{集合}$

有符号数的定点表示

图解

符号位通常0为正,1为负

注:可用原码、反码、补码三种方式来表示定
点整数和定点小数。还可用移码表示定点整数。

若真值为x,则用[x]、[x]、[x]、[x]分别
表示真值所对应的原码、反码、补码、移码

原码

总图

比如我们现在需要表示的19和-19
$$19D = 10011B $$
如果要算上符号位的话,就可以写成010011B
除了正常的表示之外,其实在20之后还隐藏了小数位置,他们是2-1,2-2等等

小数和整数运算

如果机器字长n+1位,那么原码整数的表示范围为
$$
-(2^n-1) \leq x \leq 2^n-1
$$

如果机器字长n+1位,那么原码小数的表示范围为

$$
-(1-2^{-n}) \leq x \leq 1 - 2^{-n}
$$

反码

如果符号位为0,则反码与原码相同
如果符号位为1,则数值位全部取反

实际上反码并没有什么用,反码只是"源码"变成"补码"的中间状态

反码用法

补码

正数的补码 = 原码
负数的补码 = 反码末位 + 1(要考虑进位)

补码

移码

在补码的基础上将符号位取反(移码只能用于表示整数)

移码和补码是一一对应的关系所以移码能表示的范围和补码一样

如果机器字长n+1位,移码整数的表示范围:
$$
-2^n \leq x \leq 2^n-1
$$

用几种码来表示定点整数

用几种码来表示定点整数

真值转换成其他码练习

定点整数x=50,用8位原码、反码、补码、移码表示

$$
50D = 110010B
$$

因为只有7位,所以我们在最高位带上一个0

$$110010B \rightarrow 0110010B$$

然后在最高位还要再加上一个符号位

$$0110010B \rightarrow 00110010B$$

因为这是一个正数,所以原码补码反码的格式相同

原码补码反码

移码是在符号位上取反

$$[x]_补= 00110010B \rightarrow [x]_移=10110010B$$

定点整数x=-100,用八位数原码、反码、补码、移码表示

$$
100D = [x]_原1100100B
$$

  1. 因为这是一个负数,所以我们的符号位为1

$$[x]_原1100100B \rightarrow [x]_原11100100B$$

  1. 反码就是除了符号位其他全部取反

$$[x]_原1100100B \rightarrow [x]_反10011011B$$

  1. 补码就是在反码的基础上末位+1

$$[x]_反10011011B \rightarrow [x]_补10011100$$

  1. 最后移码把符号位取反,最开头的一位变成0

$$[x]_补10011100 \rightarrow [x]_移00011100$$

-100的各种码

流程分析:

$$十进制整数 \rightarrow 二进制数 \rightarrow 确认位数 \rightarrow 根据正负补上符号位$$

$$如果为负数 \rightarrow 反码 \rightarrow 补码 \rightarrow 移码$$

$$如果为正数 \rightarrow 反码补码和原码一样 \rightarrow 移码$$

其他码转换成真值

$$
\begin{align*}
[x]_原=10001101\
[x]_反=10001101\
[x]_补=10001101\
[x]_移=10001101\
\end{align*}
$$

  1. 原码转真值
    掐去符号位,然后其他的位数正常二进制转十进制即可

$$
0001101B = 13D
$$

最后加上符号位1(表示负数),于是这个数是-13

$$[x]_原=10001101=-13$$

  1. 反码转真值
    除去符号位,其他位全部取反

$$
[x]_反=10001101 = [x]_原11110010
$$

正常的原码转换成真值

$$
[x]_原11110010 = -114
$$

  1. 补码转换成真值

补码转换成原码的方式和原码转换成补码的方式相同,都是把除了符号位的其他位取反,然后在末位加一

$$[x]_补10001101 = [x]_反11110010$$

然后在反码的基础上加一

$$ [x]_反11110010 + 1 = [x]_原11110011 $$

此时我们就可以得知,他的真值是

$$[x]_原11110011 = -115$$

  1. 移码转换成真值

符号位取反

$$[x]_移=10001101 = 00001101$$

可知这个是一个正数,正数的补码和原码是相同的(如果不相同则按补码继续进行操作)

$$00001101B = 13D$$

其他练习
更多练习

总结

总结