机器数和真值
在计算机中,表示数值的数字符号只有
0
0
0 和
1
1
1 两个数码,无法在二进制数前再加正负号,
所以我们规定最高位为符号位 ,并用
0
0
0 表示正数符号,用
1
1
1 表示负数符号。
这样,机器中的数值和符号全“数码化”了。
为简化机器中数据的运算操作,人们采用原码、补码、反码以及移码等几种方法对数值位和符号位统一进行编码。
为区别起见,我们讲在机器中的这些编码称为 机器数,
(如
10000001
10000001
10000001 )
而将一般书写表示的数称为 机器数的真值。
(如
−
0000001
-0000001
−0000001 )
数的原码、反码和补码表示
我们一般只会记忆它们之间怎么转化,但是,
你知道它们究竟是什么吗?
原码、补码、反码实际上是上文所讲的 机器数 的 表示方法 。
它们表示的是一个机器数的不同形式。
为什么要有不同形式? 正如上文的高亮所说,是为了简化机器中数据的运算操作,最后是简化到只需要进行加法运算。
我们按惯例先介绍一下它们之间的转化方式:
设
x
=
1100110
x=1100110
x=1100110 ,则
[
x
]
原
=
[
x
]
反
=
[
x
]
补
=
01100110
[x]_{原}=[x]_{反}=[x]_{补}=01100110
[x]原=[x]反=[x]补=01100110
设
x
=
−
1100110
x=-1100110
x=−1100110 ,则
[
x
]
原
=
11100111
[x]_{原}=11100111
[x]原=11100111,
[
x
]
反
=
10011000
[x]_{反}=10011000
[x]反=10011000,
[
x
]
补
=
10011001
[x]_{补}=10011001
[x]补=10011001
对于正数来说,它的原码、反码、补码都是它的真值本身。
对于负数来说,它的原码是把真值前的负号换成
1
1
1 ,反码是 它的原码对所有数值位取反的结果 ,补码是它的反码加
1
1
1 。
注:
[
−
10000000
]
原
=
10000000
[-10000000]_{原}=10000000
[−10000000]原=10000000
如何用加法实现减法运算?
我们不把它看成 一个数减一个数 ,
而是一个负数和另一个数相加,
用补码表示法表示这两个数,再相加,
得到一个 机器数 ,
把它看成补码表示法表示的数,
最后用原码还原,得到正确的值。
数的定点表示和浮点表示
在计算机中,小数点一般有两种表示法:
一种是小数点固定在某一个位置的 定点表示法 ,
另一种是小数点的位置可任意移动的 浮点表示法 。
定点表示法
机器中所有数的小数点是固定不变的,因而小数点就不必使用记号表示出来。
实际上,小数点可固定在任何一个位置上。
浮点表示法
在数的定点表示法中,由于数的表示范围较窄,常常不能满足各种数值问题的需要。为了扩大数的表示范围,方便用户使用,有些计算机常采用浮点表示法。
表示一个浮点数,要用两部分:
尾数 和 阶码
尾数:用以表示数的有效数值
阶码:用以表示小数点在该数中的位置
计算机多数情况下采用浮点数表示数值,它与科学计数法相似,
把一个二进制数 通过移动小数点位置 表示成阶码和尾数两部分:
N
=
2
E
×
S
N=2^{E}\times S
N=2E×S
其中:
E
E
E 为
N
N
N 的阶码,是有符号的整数,
S
S
S 为
N
N
N 的尾数,是数值的有效数字部分,一般规定取二进制纯小数形式。
例:
1011101
B
=
2
+
7
×
0.1011101
1011101B=2^{+7}\times 0.1011101
1011101B=2+7×0.1011101
101.1101
B
=
2
+
3
×
0.1011101
101.1101B=2^{+3}\times 0.1011101
101.1101B=2+3×0.1011101
0.01011101
B
=
2
−
1
×
0.1011101
0.01011101B=2^{-1}\times 0.1011101
0.01011101B=2−1×0.1011101