在计算机中,表示数值的数字符号只有 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
