1. 数据的类型
- 按数据的表示范围分
- 定点数:小数点位置固定,数据表示范围小
- 浮点数:小数点位置不固定,数据表示范围较大
- 按能否表示负数分
- 无符号数:所有位均表示数值,直接用二进制数表示
- 有符号数:有正负之分,最高位为符号位,其余表示数值
- 按数据格式分
- 真值:没有经过编码的直观数据表示方式,其值可带正负号,任何数制均可(方便人们理解)
- 机器数:符号化后的数值(包括正负号的表示),一般位数固定(
8
、16
、32
…),不能随便忽略任何位置上的 0 0 0 或 1 1 1(方便计算机处理)
2. 定点数
2.1 定点数的基本概念
定点数是小数点固定在某一位置的数据,假设采用 n + 1 n+1 n+1 位数据。
2.1.1 纯小数的表示方法
表示形式为
x
0
.
x
−
1
x
−
2
x
−
3
⋅
⋅
⋅
x
−
n
x_0.x_{-1}x_{-2}x_{-3}···x_{-n}
x0.x−1x−2x−3⋅⋅⋅x−n其中有符号数的机器表示为
x
=
x
s
x
−
1
x
−
2
.
.
.
x
−
n
0
≤
∣
x
∣
≤
1
−
2
−
n
,
x
s
为
符
号
位
x=x_sx_{-1}x_{-2}...x_{-n}\ \ \ \ \ \ \ \ \ \ 0\le |x|\le 1-2^{-n},x_s为符号位
x=xsx−1x−2...x−n 0≤∣x∣≤1−2−n,xs为符号位其中符号位为
0
0
0 表示为正,符号位为
1
1
1 表示为负。当数值位全部为
0
0
0 时,数
x
x
x 的绝对值最小,即为
0
0
0,当数值位全部为
1
1
1 时,数
x
x
x 的绝对值最大,即为
1
−
2
−
n
1-2^{-n}
1−2−n。
无符号数的机器表示为
x
=
x
0
x
−
1
x
−
2
.
.
.
x
−
n
0
≤
x
≤
1
−
2
−
n
x=x_0x_{-1}x_{-2}...x_{-n}\ \ \ \ \ \ \ \ \ \ 0\le x\le 1-2^{-n}
x=x0x−1x−2...x−n 0≤x≤1−2−n综上,数据的表示范围为
0.0
⋅
⋅
⋅
0
=
0
≤
∣
x
∣
≤
1
−
2
−
n
=
0.1
⋅
⋅
⋅
1
0.0···0=0\le |x|\le 1-2^{-n}=0.1···1
0.0⋅⋅⋅0=0≤∣x∣≤1−2−n=0.1⋅⋅⋅1
2.1.2 纯整数的表示方法
表示形式为
x
n
x
n
−
1
x
n
−
2
⋅
⋅
⋅
x
1
x
0
.
x_nx_{n-1}x_{n-2}···x_1x_0.
xnxn−1xn−2⋅⋅⋅x1x0.其中有符号数的机器表示为
x
=
x
s
x
n
−
1
⋅
⋅
⋅
x
1
x
0
∣
x
∣
≤
2
n
−
1
,
x
s
为
符
号
位
x=x_sx_{n-1}···x_1x_0\ \ \ \ \ \ \ \ \ \ |x|\le 2^n-1,x_s为符号位
x=xsxn−1⋅⋅⋅x1x0 ∣x∣≤2n−1,xs为符号位其中符号位为
0
0
0 表示为正,符号位为
1
1
1 表示为负。当数值位全部为
0
0
0 时,数
x
x
x 的绝对值最小,即为
0
0
0,当数值位全部为
1
1
1 时,数
x
x
x 的绝对值最大,即为
2
n
−
1
2^n-1
2n−1。
无符号数的机器表示为
x
=
x
n
x
n
−
1
⋅
⋅
⋅
x
1
x
0
0
≤
x
≤
2
n
+
1
−
1
,
x
n
为
数
值
最
高
位
x=x_nx_{n-1}···x_1x_0\ \ \ \ \ \ \ \ \ \ 0\le x\le 2^{n+1}-1,x_n为数值最高位
x=xnxn−1⋅⋅⋅x1x0 0≤x≤2n+1−1,xn为数值最高位由此可见,无符号整数比有符号整数表示的位数多一位(最高位)。
注意,无论是纯小数还是纯整数,小数点的位置都是事先规定好的,并不需要额外保存(即缺省)。
目前计算机表示纯小数并不使用定点数,定点数主要用来表示纯整数。
2.1.3 定点数的缺点
- 所能表示的数据范围小
- 使用不方便,运算精度较低
- 存储单元利用率低
2.2 定点数的原码表示法
设机器数的表示形式 x n x n − 1 x n − 2 ⋅ ⋅ ⋅ x 1 x 0 x_nx_{n-1}x_{n-2}···x_1x_0 xnxn−1xn−2⋅⋅⋅x1x0
2.2.1 原码表示小数
- 对于正数 x = + 0. x n − 1 ⋅ ⋅ ⋅ x 1 x 0 x=+0.x_{n-1}···x_1x_0 x=+0.xn−1⋅⋅⋅x1x0,有 [ x ] 原 = 0 x n − 1 ⋅ ⋅ ⋅ x 1 x 0 [x]_原=\textbf{0}x_{n-1}···x_1x_0 [x]原=0xn−1⋅⋅⋅x1x0
- 对于负数
x
=
−
0.
x
n
−
1
⋅
⋅
⋅
x
1
x
0
x=-0.x_{n-1}···x_1x_0
x=−0.xn−1⋅⋅⋅x1x0,有
[
x
]
原
=
1
x
n
−
1
⋅
⋅
⋅
x
1
x
0
[x]_原=\textbf{1}x_{n-1}···x_1x_0
[x]原=1xn−1⋅⋅⋅x1x0
即
[ x ] 原 = { x , 0 ≤ x < 1 1 − x = 1 + ∣ x ∣ , − 1 < x ≤ 0 [x]_原=\left\{ \begin{array}{l} x,0\le x<1\\ 1-x=1+|x|,-1<x\le 0\\ \end{array} \right. [x]原={x,0≤x<11−x=1+∣x∣,−1<x≤0
2.2.2 原码表示整数
- 对于正数 x = + x n − 1 ⋅ ⋅ ⋅ x 1 x 0 x=+x_{n-1}···x_1x_0 x=+xn−1⋅⋅⋅x1x0,有 [ x ] 原 = 0 x n − 1 ⋅ ⋅ ⋅ x 1 x 0 [x]_原=\textbf{0}x_{n-1}···x_1x_0 [x]原=0xn−1⋅⋅⋅x1x0
- 对于负数
x
=
−
x
n
−
1
⋅
⋅
⋅
x
1
x
0
x=-x_{n-1}···x_1x_0
x=−xn−1⋅⋅⋅x1x0,有
[
x
]
原
=
1
x
n
−
1
⋅
⋅
⋅
x
1
x
0
[x]_原=\textbf{1}x_{n-1}···x_1x_0
[x]原=1xn−1⋅⋅⋅x1x0
即
[ x ] 原 = { x , 0 ≤ x < 2 n 2 n − x = 2 n + ∣ x ∣ , − 2 n < x ≤ 0 [x]_原=\left\{ \begin{array}{l} x,0\le x<2^n\\ 2^n-x=2^n+|x|,-2^n<x\le 0\\ \end{array} \right. [x]原={x,0≤x<2n2n−x=2n+∣x∣,−2n<x≤0
2.2.3 原码表示法的特点
- 0 有两种表示方法
- [ + 0 ] 原 = 00 ⋅ ⋅ ⋅ 0 [+0]_原=00···0 [+0]原=00⋅⋅⋅0
- [ − 0 ] 原 = 10 ⋅ ⋅ ⋅ 0 [-0]_原=10···0 [−0]原=10⋅⋅⋅0
- 数据的表示范围
- 小数: − 1 < x < 1 -1<x<1 −1<x<1
- 整数: − 2 n < x < 2 n -2^n<x<2^n −2n<x<2n
- 优点:机器数与真值的对应关系简单
- 缺点:参与运算复杂,需要分别考虑数值位与符号位
2.3 定点数的补码表示法
模的概念:所表示数的最大容量。若有
n
+
1
n+1
n+1 位整数,则其模为
2
n
+
1
2^{n+1}
2n+1。
设机器数的表示形式
x
n
x
n
−
1
x
n
−
2
⋅
⋅
⋅
x
1
x
0
x_nx_{n-1}x_{n-2}···x_1x_0
xnxn−1xn−2⋅⋅⋅x1x0
2.3.1 补码表示小数
[
x
]
补
=
{
x
,
0
≤
x
<
1
2
+
x
=
2
−
∣
x
∣
,
−
1
≤
x
≤
0
[x]_补=\left\{ \begin{array}{l} x,0\le x<1\\ 2+x=2-|x|,-1\le x\le 0\\ \end{array} \right.
[x]补={x,0≤x<12+x=2−∣x∣,−1≤x≤0
相当于真值 mod
2
2
2
2.3.2 补码表示整数
补码表示的真值为
x
=
−
2
n
x
n
+
∑
i
=
0
n
−
1
2
i
x
i
x=-2^nx_n+\sum_{i=0}^{n-1}{2^ix_i}
x=−2nxn+i=0∑n−12ixi相当于最高位权值的符号与无符号数相反。
补码表示的定义为
[
x
]
补
=
{
x
,
0
≤
x
<
2
n
2
n
+
1
+
x
=
2
n
+
1
−
∣
x
∣
,
−
2
n
≤
x
≤
0
[x]_补=\left\{ \begin{array}{l} x,0\le x< 2^n\\ 2^{n+1}+x=2^{n+1}-|x|,-2^n\le x\le 0\\ \end{array} \right.
[x]补={x,0≤x<2n2n+1+x=2n+1−∣x∣,−2n≤x≤0
相当于真值 mod
2
n
+
1
2^{n+1}
2n+1
2.3.3 原码和补码的相互转换
- 对于正数,有 [ x ] 原 = [ x ] 补 [x]_原=[x]_补 [x]原=[x]补
- 对于负数,由原码求补码:除符号位以外,其余各位按位取反,再加 1 1 1(简而言之,从最低位开始,遇到的第一个 1 1 1 以前的各位保持不变,之后各位取反)
2.3.4 求相反数的补码
连同符号位一起取反,再加 1 1 1,即 [ − x ] 补 = ¬ [ x ] 补 + 1 [-x]_补=\lnot[x]_补+1 [−x]补=¬[x]补+1
2.4 移码表示法
移码通常用于表示浮点数的阶码。其传统定义为
[
x
]
移
=
2
n
+
x
−
2
n
≤
x
<
2
n
[x]_移=2^n+x\ \ \ \ \ \ \ \ \ -2^n\le x<2^n
[x]移=2n+x −2n≤x<2n和
[
x
]
补
[x]_补
[x]补 的区别仅仅在于符号位相反。
移码表示法的优点::可以直观地判断两个数据的大小
2.5 三种编码形式的总结
正数 | 负数 | |
---|---|---|
原码 | 符号位为 0 0 0,数值部分与真值相同 | 符号位为 1 1 1,数值部分与真值的绝对值相同 |
补码 | 同上 | 符号位为 1 1 1,数值部分与原码各位相反,末位再加 1 1 1 |
移码 | 与上述两种符号位相反,数值位相同 | 符号位与补码相反,数值位与补码相同 |
各种编码格式的示例:
示例
真值 + 10000101 +10000101 +10000101 − 10101100 -10101100 −10101100 原码 0 10000101 0\ 10000101 0 10000101 1 10101100 1\ 10101100 1 10101100 补码 0 10000101 0\ 10000101 0 10000101 1 01010100 1\ 01010100 1 01010100 反码 0 10000101 0\ 10000101 0 10000101 1 01010011 1\ 01010011 1 01010011 移码 1 10000101 1\ 10000101 1 10000101 0 01010100 0\ 01010100 0 01010100
3. 浮点数
定义:小数点的位置可变,形如科学计数法中的数据表示。
3.1 浮点数的形式
浮点数一般用如下格式来表示: N = R e × M N=R^e\times M N=Re×M
- M M M:尾数,是一个纯小数,表示数据的全部有效数位,决定数值的精度。
- R R R:基数,表示当前的数制,计算机中缺省为 2 2 2。
- e e e:阶码,是一个整数,用于指出小数点在该数中的位置,决定数据的数值大小。
3.2 浮点数的规格化
- 规格化要求: 1 / R ≤ ∣ M ∣ < 1 1/R\le |M|<1 1/R≤∣M∣<1
- 规格化的处理方法:移动小数点位置,同时改变阶码:
- 尾数向左移 n n n 位(小数点右移),同时阶码减 n n n
- 尾数向右移 n n n 位(小数点左移),同时阶码加 n n n
3.2.1 尾数用原码表示时
- 尾数最高数值位为 1 1 1
- 尾数形如 0.1 ⋅ ⋅ ⋅ 0.1··· 0.1⋅⋅⋅(正);或 1.1 ⋅ ⋅ ⋅ 1.1··· 1.1⋅⋅⋅(负)
3.2.2 尾数用补码表示时
- 尾数最高数值位和尾数符号位相反
- 尾数形如 0.1 ⋅ ⋅ ⋅ 0.1··· 0.1⋅⋅⋅(正);或 1.0 ⋅ ⋅ ⋅ 1.0··· 1.0⋅⋅⋅(负)
3.3 浮点数的最值问题
最小负数 | 最大负数 | 最小正数 | 最大正数 | |
---|---|---|---|---|
尾数 | 负的最小值 | 负的最大值 | 正的最小值 | 正的最大值 |
阶码 | 正的最大值 | 负的最小值 | 负的最小值 | 正的最大值 |
- 注意:当尾数采用不同的表示方法,或不同规格时,其范围一般不同(注意规格化表示的限制)
- 阶码影响浮点数绝对值的大小
- 浮点数的溢出
- 上溢:阶码大于所能表示的最大值
- 下溢:阶码小于所能表示的最小值
- 机器零:尾数为 0 0 0 ,或阶码小于所能表示的最小值
3.4 浮点数的 IEEE754 标准表示
3.4.1 32 位浮点数和 64 位浮点数
- 32 位浮点数
1 位 数 符 S + 8 位 阶 码 E + 23 位 尾 数 M ( 数 值 部 分 ) 1位数符S+8位阶码E+23位尾数M(数值部分) 1位数符S+8位阶码E+23位尾数M(数值部分) - 64 位浮点数
1 位 数 符 S + 11 位 阶 码 E + 52 位 尾 数 M ( 数 值 部 分 ) 1位数符S+11位阶码E+52位尾数M(数值部分) 1位数符S+11位阶码E+52位尾数M(数值部分) - 数符 S S S:表示浮点数的符号,占 1 1 1 位, 0 0 0 表示正数, 1 1 1 表示负数
- 尾数 M M M:原码用纯小数表示,小数点在尾数最前面,实际值为 1. M 1.M 1.M
- 阶码
E
E
E:采用有偏移的移码表示,偏移量
X
X
X 为
127
127
127(
32位
)或 1023 1023 1023(64位
) - 浮点数的真值为 N = ( − 1 ) S × ( 1. M ) × 2 E − X N=(-1)^S \times (1.M)\times 2^{E-X} N=(−1)S×(1.M)×2E−X
3.4.2 浮点数的表示范围
重要结论:浮点数不能精确表示 0,且有正负之分