机器数与真值
由于计算机只能直接识别和处理用0,1两种状态表示的二进制形式的数据,所以在计算机中无法按人门日常的书写习惯
用正负号加绝对值来表示数值,而与数字一样,需要用二进制代码 0 和 1 来表示 正,负 号.这样,在计算机中表示带符号
的数值数据时,数符和数据均采用0,1进行了代码化.这种采用二进制表示形式的连同数符一起代码化了的数据,在 计算机
中统称为机器数或机器码.而与机器数对应的用正,负符号加绝对值来表示的实际数值称为真值.
机器数可分为无符号数和带符号数两种.无符号数是指计算机字长的所以二进制位均表示数值.带符号数是指机器数分
为符号和数值部分,且均用二进制代码表示.
例 : 设某机器的字长为 8 位,无符号整数在机器中表示形式为:
7 0
-------------
数 值
-------------
带符号整数在机器中的表示形式为:
7 6 0
-------------
符号 | 数值
-------------
分别写出机器数 10011001 作为无符号整数和带符号整数对应的真值.
解: 10011001 作为无符号整数时,对应的真值是 10011001(二进制) = 153(十进制) .
10011001 作为带符号整数时,其最高位的数码1代表符号"-",所以与机器数 10011001 对应的
真值是 - 0011001(二进制) = - 25(十进制).
综上所述,可得机器数的特点为:
(1) 数的符号采用二进制代码化,0代表"+',1代表"-".通常将符号的代码放在数据的最高位.
(2) 小数点本身是隐含的,不占用储存空间.
(3) 每个机器数数据所占的二进制位数受机器硬件规模的的限制,与机器字长有关.超过机器字长的数值要舍去.
例如,如果要将 x=+0.101100111在字长为8位的机器中中表示为一个单字长的数,则只能表示为01011001,最
底两位的两个1无法在机器中表示.
因为机器数的长度是由机器硬件规模规定的,所以机器数表示的数值是不连续的.例如,8位的二进制无符号数可以
表示256个整数: 00000000-11111111可表示0-255; 8位二进制带符号数中: 00000000-01111111可表示正整数0-127;
11111111-10000000 可表示负整数 -127-0;,共256个数,其中00000000表示+0,10000000表示-0.
在计算机中, 为了方便于带符号数的运算和处理,对带符号数的机器数有各种定义和表示方法,下面将接受带符号
数的原码,补码,反码和移码表示.
原 码
原码表示的一种简单,直观的机器数表示方法,其表示形式与真值的形式最为接近.原码表示规定机器数的最高位为符
号位,0表示整数,1表示负数,数值部分在符号位后面,并以绝对值形式给出.
1. 原 码 的 定 义 .
设 x 为二进制数,数值部分的位数为 n ,下式给出了 x 为纯小数 ±0.x1x2...xn 和 x 为纯整数 ±x1x2...xn时
的原码表示的定义.
纯 小 数 原 码 的 定 义 :
X ( 1 ≤ X < 1 )
[X]原 = ( X为纯小数 )
1 - X = 1 + |X| ( -1 < X ≤ 0)
纯 整 数 原 码 的 定 义 :
X ( 0 ≤ X < 2^n ) 2^n指2的n次方后面都这样表示
[X]原 = ( X为纯整数 )
2^n - X = 2^n + |X| ( -2^n < X ≤ 0)
根据定义可以知, X 的原码 [X原] 是一个 n+1 位的机器数 x0x1x2....xn ,其中 x0 为符号位, x1x2...xn 为数值
部分, n 为 X 数值的长度.
例 已知 X , 求 X 的原码[X原].
(1) X = +0.1010110 (2) X =-0.1010110 (3) X = +1010110 (4) X = -1010110
解: 根据原码的定义,可得
(1) [X原] = X = 0.1010110
(2) [X原] = 1-X = 1+0.1010110 = 101010110
(3) [X原] = X = 01010110
(4) [X原] = 2^7-X = 2^7 + 1010110 = 10000000+1010110 = 11010110
由例题可知 :
(1) [X原]的表示形式 x0x1x2...xn 为符号位加上 X 的绝对值. 当 X≥0 时,符号位 x0=0; X≤0 时,符号
位 x0=1.
(2) 当 X 为纯小数时,[X原]中的小数点默认在符号位 x0 数值最位 x1 之间; 当 X≥ 0时,[X原]=X;当X≤0
时,[X原] = 1+|X| ,既符号位加上X的小数部分的绝对值.
当 X 为纯整数时,[X原]中的小数点默认在数值位最底位 xn 之后; 当 X≥ 0时,[X原] = X; 当X≤0
时,[X原] = 2^n+|X| ,其中 2^n 是符号位的权值, 2^n+|X| 相当于使符号位为 1 .
(3) 将[X原]的符号取反,既可得到 [-X原] .
2. 原 码 中 0 的 表 示
根据定义式可知,在原码表示中,真值0有两种不同的表示形式,既 +0 和 -0 .
纯小数 +0 和 -0 的原码表示:
[+0原] = 0.00...0 [-0原] = 1.00...0
纯整数 +0 和 -0 的原码表示:
[+0原] = 00...0 [-0原] = 100...0
3. 原 码 的 左 移 和 右 移
对于二进制纯小数 x = 0.x1x2...xn 来讲, 在求 2x 时,只需要将 x1x2...xn 依次左移一位,移出的最底位的空格
位填 0 即可, 即 2x=x1.x2...xn0 . 当然,为了保证 x 左移后仍然是纯小数, 0.x1x2...xn 中的 x1 应为 0, 否则就
会大于1, 而不是纯小数了. 在求 1/2x 时, 只需要将 x1x2...xn 依次右移一位,移出的最高位的空格位填 0 即可, 即
1/2x=0.0x1x2...xn .如果仍然要保持 n 为数值, 则 x 右移后 ,将丢失最底位数字 xn .二进制纯整数的左,右移也可
以同样处理.
由于原码是在二进制真值的基础上增加了符号的机器数,根据二进制数的移位规则个原码的定义,可知原码的移位规
则是: 符号位不变,数值部分左移或右移,移出的空位填 0 .
例: 已知[X原],求[2X原],[1/2X原].
(1) [X原] = 0.0101001 (2)[X原] = 10011010
解: (1) [2X原] = 0.1010010 左移后,符号位保持不变,最高位移出,最低位填 0 .
[1/2X原] = 0.0010100 右移后,符号位保持不变,最高位填 0,末尾的1移出.
(2) [2X原] = 10110100
[1/2X原] = 10001101
在原码的左移过程中,主要不要将高位的有效位数值育雏,否则将回出错.
4. 原 码 的 特 点
(1)原码表示直观,易懂,与真值的转化容易.
(2)原码表示中的 0 有两种不同的表示形式,给使用带来了不便.
通常 0 的原码用 [+0原] 表示,若在计算过程中出现了[-0原] ,则需要用硬件将 [-0原] 变为 [+0原] .
(3)原码表示加减运算复杂.
利用原码进行两次相加运算时,首先要判别两数的符号,若同号则做加法,如异号则做减法.在利用原码进行相减时 ,不
仅要判别两数绝对值的符号,使得同号相减,异号相加;还要判别两数绝对值的大小,用绝对值大的数减去绝对值小的数,取
取绝对值大的数的符号为结果符号. 可见原码表示不便于实现加减运算.