机器数有无符号数和带符号数,无符号数表示正数, 在机器数中没有符号位.
对于无符号数, 若约定小数点的位置在机器数的最低位之后, 则是纯整数, 若小数点的位置在机器数的最高位之前, 则是纯小数.
对于带符号数, 机器数的最高位是表示正、负的符号位, 其余表示数值
为了便于运算, 带符号的机器数采用原码, 反码和补码等不同的编码方法, 机器数的这些编码方法成为码制。
原码, 反码, 补码
原码表示法
数值X
的原码记为[X]原
, 如果机器字长为n
(即采用n
个二进制表示数据), 则原码定位如下:
1. 若X
为纯整数, 则
[ X ] 原 = { X , 0 ≤ X ≤ 2 n − 1 − 1 2 n − 1 + ∣ X ∣ , - ( 2 n − 1 − 1 ) ≤ X ≤ 0 [X]_原 = \begin{cases} X, & \text 0\le X \le 2^{n-1}-1 \\ 2^n -1 +|X|, & \text -(2^{n-1} -1) \le X \le 0 \\ \end{cases} [X]原={X,2n−1+∣X∣,0≤X≤2n−1−1-(2n−1−1)≤X≤0
2. 若X
为纯小数, 则
[ X ] 原 = { X , 0 ≤ X < 1 2 0 + ∣ X ∣ , - 1 < X ≤ 0 [X]_原 = \begin{cases} X, & \text 0\le X < 1 \\ 2^0 +|X|, & \text -1 < X \le0 \\ \end{cases} [X]原={X,20+∣X∣,0≤X<1-1<X≤0
若机器字长为n
等于8,
[
+
1
]
原
=
00000001
[
−
1
]
原
=
10000001
[+1]_原 = 00000001 \qquad [-1]_原=10000001 \\
[+1]原=00000001[−1]原=10000001
[
+
127
]
原
=
01111111
[
−
127
]
原
=
11111111
[+127]_原 = 01111111 \qquad [-127]_原=11111111 \\
[+127]原=01111111[−127]原=11111111
在原码表示法中, 最高位为符号位, 0表示正号, 1表示负号, 其余n-1位表示数值的绝对值, 数值0的原码为
‘
[
+
0
]
原
=
00000000
‘
,
[
−
0
]
原
=
10000000
`[+0]_原= 00000000`, [-0]_原= 10000000
‘[+0]原=00000000‘,[−0]原=10000000
反码表示法
数值X
的反码记作[X]反
, 若机器字长为n
, 则:
当X
为纯整数时
[
X
]
反
=
{
X
,
0
≤
X
<
2
n
−
1
−
1
2
n
−
1
+
X
,
-
(
2
n
−
1
−
1
)
≤
X
≤
0
[X]_反 = \begin{cases} X, & \text 0\le X < 2^{n-1}-1 \\ 2^n-1 + X, & \text -(2^{n-1}-1) \le X \le 0 \\ \end{cases}
[X]反={X,2n−1+X,0≤X<2n−1−1-(2n−1−1)≤X≤0
当X
为纯小数时
[
X
]
反
=
{
X
,
0
≤
X
<
1
2
−
2
−
(
n
−
1
)
+
X
,
-
1
<
X
≤
0
[X]_反 = \begin{cases} X, & \text 0\le X \lt 1 \\ 2-2^{-(n-1)}+X, & \text -1 \lt X \le0 \\ \end{cases}
[X]反={X,2−2−(n−1)+X,0≤X<1-1<X≤0
[
+
1
]
反
=
00000001
[
−
1
]
反
=
11111110
[+1]_反 = 00000001 \qquad [-1]_反=11111110 \\
[+1]反=00000001[−1]反=11111110
[
+
127
]
反
=
01111111
[
−
127
]
反
=
10000000
[+127]_反 = 01111111 \qquad [-127]_反=10000000 \\
[+127]反=01111111[−127]反=10000000
在反码表示中, 最高位是符号位, 0表示正号, 1表示负号, 正数的反码与原码相同, 负数的反码则是其绝对值按位取反
数值0的反码有两种形式:
[
+
0
]
反
∗
∗
=
∗
∗
00000000
,
[
−
0
]
反
∗
∗
=
∗
∗
11111111
[+0]反** = **00000000, [-0]反** = **11111111
[+0]反∗∗=∗∗00000000,[−0]反∗∗=∗∗11111111
补码表示法
数值X
的补码记作[X]补
, 如果机器字长为n
, 则
若X
是纯整数
[
X
]
补
=
{
X
,
0
≤
X
≤
2
n
−
1
−
1
2
n
+
X
,
-
2
n
−
1
≤
X
≤
0
[X]_补 = \begin{cases} X, & \text 0\le X \le 2^{n-1}-1 \\ 2^n+X, & \text -2^{n-1} \le X \le0 \\ \end{cases}
[X]补={X,2n+X,0≤X≤2n−1−1-2n−1≤X≤0
若X
是纯小数
[
X
]
补
=
{
X
,
0
≤
X
<
1
2
+
X
,
-
1
≤
X
<
0
[X]_补 = \begin{cases} X, & \text 0\le X \lt 1 \\ 2+X, & \text -1 \le X \lt0 \\ \end{cases}
[X]补={X,2+X,0≤X<1-1≤X<0
示例:
[
+
1
]
补
=
00000001
[
−
1
]
补
=
11111111
[+1]_补 = 00000001 \qquad [-1]_补=11111111 \\
[+1]补=00000001[−1]补=11111111
[
+
127
]
补
=
01111111
[
−
127
]
补
=
10000001
[+127]_补 = 01111111 \qquad [-127]_补=10000001 \\
[+127]补=01111111[−127]补=10000001
正数的补码与其原码和反码相同, 负数的补码则等于其反码的末位加1
移码表示法
移码表示法是在数X
上增加一个偏移量来定义的, 常用于表示浮点中的阶码, 如果机器字长为n
, 规定偏移量为2n-1
[ X ] 移 = 2 n − 1 + X ( − 2 n − 1 ≤ X < 2 n − 1 ) [X]_移 = 2^{n-1} + X(-2^{n-1} \le X \lt 2^{n-1}) \\ [X]移=2n−1+X(−2n−1≤X<2n−1)
[
+
1
]
移
=
10000001
[
−
1
]
移
=
01111111
[+1]_移 = 10000001 \qquad [-1]_移=01111111 \\
[+1]移=10000001[−1]移=01111111
[
+
127
]
移
=
11111111
[
−
127
]
移
=
00000001
[+127]_移 = 11111111 \qquad [-127]_移=00000001 \\
[+127]移=11111111[−127]移=00000001