数字
有符号数和无符号数
无符号数
无符号数只有数据位,数据范围与寄存器位数有关。
如八位寄存器,存储范围是$(00000000)_2到(11111111)_2$,也就是$(0)_{10}到(255)_{10}$。
有符号数
有符号数包含符号位和数据位。
机器数与真值
真值 | 机器数 |
---|---|
带符号的数 | 符号数字化的数 |
+0.1001 | 01001 |
-0.1011 | 11011 |
小数定点型 | 小数点规定放在符号之后 |
+1100 | 01100 |
-1100 | 11100 |
整数定点型 | 小数点规定放在数值之后 |
原码表示法
定义
- 整数:
$$
[x]_原 =
\begin{cases}
0,x & 2^n > x \geq 0\\
2^n-x & 0 \ge x > -2^n
\end{cases}
$$
x为真值,n为整数的位数
$x$ | $[x]_原$ |
---|---|
+1110 | 0,1110 |
-1110 | $2^4-(-1110)=1,1110$ |
- 小数
$$
[x]_原 =
\begin{cases}
x & 1 > x \ge 0 \\
1-x & 0 \ge x > -1
\end{cases}
$$
x为真值
$x$ | $[x]_原$ |
---|---|
+0.1101 | 0.1101 |
-0.1101 | $1-(-0.1101)=1.1101$ |
原码的特点
优点:简单,直观
缺点:计算机中一般只有加法器,但是如果原码相加,有可能是加法,也有可能是减法。如下表:
要求 | 数1 | 数2 | 实际操作 | 结果符号 |
---|---|---|---|---|
加法 | 正 | 正 | 加法 | 正 |
加法 | 正 | 负 | 减法 | 可正可负 |
加法 | 负 | 正 | 减法 | 可正可负 |
加法 | 负 | 负 | 加法 | 负 |
为了解决这一缺点,我们可以寻找一个和这个负数等价的正数,进行加法操作。就此引出补码。
补码表示法
整数
一个负数加上“模”就是负数的补数。
一个正数和一个负数互为补数时,他们绝对值之和就是“模”。
例如模16的情况下,要将1011变为0000,可以减去1011,也可以加上0101.记作$-1011 \equiv +0101$
定义
正数的补数即为其本身
$-1011 \equiv +0101$
他俩的补数均为+0101,因此为了区分正负性,需要添加符号位。
+0101的补码就是0,0101。-1011的补码就是1,0101。
负数的补数=$2^{n+1}+负数$
eg: -1011的补码 = $2^{4+1}+(-1011)=1,0101$
总结为
$$
[x]_补 = \begin{cases}
0,x & 2^n > x \geq 0\\
2^{n+1}+x & 0 > x >= -2^n(mod 2^{n+1})
\end{cases}
$$
小数
定义
$$
[x]_补 = \begin{cases}
x & 1 > x \geq 0\\
2+x & 0 > x >= -1(mod 2)
\end{cases}
$$
其实就是整数的那个式子,n=0
快捷求法
当真值为负时,补码可以用原码除符号位的每一位取反再加一(反码加一)求得。
反码表示法
快捷求法
正数的反码是其本身。
负数的反码是除符号位的每一位取反(补码减一)。
移码表示法
用补码表示很难反映出真值大小。可以用移码表示法。
定义
$$
[x]_移=2^n+x(x)
$$
x为真值,n为整数的位数。
真值 | 补码 | 移码 |
---|---|---|
+1100100 | 0,1100100 | 1,1100100 |
-1100100 | 1,0011100 | 0,0011100 |
可以看出,补码和移码只差一个符号位。(1变0,0变1)
数的定点表示和浮点表示
定点表示
小数点按约定方式标出。
定点机 | 小数定点机 | 整数定点机 |
---|---|---|
原码 | $-(1-2^{-n})到(1-2^{-n})$ | $-(2^{n}-1)到(2^{n}-1)$ |
补码 | $-1到(1-2^{-n})$ | $-2^{n}到(2^{n}-1)$ |
反码 | $-(1-2^{-n})到(1-2^{-n})$ | $-(2^{n}-1)到(2^{n}-1)$ |
浮点表示
$$
N=S*r^{j} \\ 浮点数的一般形式(科学计数法)
$$
N:要表示的小数,S:尾数,j:阶码,r:尾数的基值
计算机中r取2,4,8,16等数值
计算机中S小数,可正可负
计算机中j整数,可正可负
最小负数:$-2^{(2^m-1)}*(1-2^{-n})$
最大负数:$-2^{-(2^m-1)}*2^-n$
最小正数:$2^{-(2^m-1)}*2^-n$
最大正数:$2^{(2^m-1)}*(1-2^{-n})$