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}
$$
一个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
$$[x]_原1100100B \rightarrow [x]_原11100100B$$
- 反码就是除了符号位其他全部取反
$$[x]_原1100100B \rightarrow [x]_反10011011B$$
- 补码就是在反码的基础上末位+1
$$[x]_反10011011B \rightarrow [x]_补10011100$$
- 最后移码把符号位取反,最开头的一位变成0
$$[x]_补10011100 \rightarrow [x]_移00011100$$
流程分析:
$$十进制整数 \rightarrow 二进制数 \rightarrow 确认位数 \rightarrow 根据正负补上符号位$$
$$如果为负数 \rightarrow 反码 \rightarrow 补码 \rightarrow 移码$$
$$如果为正数 \rightarrow 反码补码和原码一样 \rightarrow 移码$$
其他码转换成真值
$$
\begin{align*}
[x]_原=10001101\
[x]_反=10001101\
[x]_补=10001101\
[x]_移=10001101\
\end{align*}
$$
- 原码转真值
掐去符号位,然后其他的位数正常二进制转十进制即可
$$
0001101B = 13D
$$
最后加上符号位1(表示负数),于是这个数是-13
$$[x]_原=10001101=-13$$
- 反码转真值
除去符号位,其他位全部取反
$$
[x]_反=10001101 = [x]_原11110010
$$
正常的原码转换成真值
$$
[x]_原11110010 = -114
$$
- 补码转换成真值
补码转换成原码的方式和原码转换成补码的方式相同,都是把除了符号位的其他位取反,然后在末位加一
$$[x]_补10001101 = [x]_反11110010$$
然后在反码的基础上加一
$$ [x]_反11110010 + 1 = [x]_原11110011 $$
此时我们就可以得知,他的真值是
$$[x]_原11110011 = -115$$
- 移码转换成真值
符号位取反
$$[x]_移=10001101 = 00001101$$
可知这个是一个正数,正数的补码和原码是相同的(如果不相同则按补码继续进行操作)
$$00001101B = 13D$$
其他练习
总结
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!