计算机内数据和指令都是由晶体管和门电路等元件完成的,对于这些元件来说,开或者关是其唯一的状态,这种状态的表现就是二进制的理念。就像黑客帝国世界中漫天飞的0和1一样,计算机世界使用的机器语言也只有0和1。而在机器语言中,当计算机想要表示一个数字时,这时就得使用机器数了,机器数所表示的真实数值称为真值。
机器数有两个特点:
计算机数据常用的单位一般为以下四种:
在机器数中,小数点的位置是隐含指定的。小数点的处理方式有以下两种方式:
注意这里,尾数才是数值的有效部分,指数决定数值的大小,也就是说,小数点的实际位置是由指数来决定的,这也是浮点数的特性之一。
在计算机中,一个数的正负是通过二进制数0和1去表示的。一般这个数放在一个字的最高位(Most Significant Bit),即最左边一位,记作符号位。一般带符号的整数有如下表现形式:

原码表示方法简单易懂,他与真值的转化,往往通过人脑就可以完成。并且原码的计算也与人类的脑力运算差不多。
例如,两个数相减,我们先要判断它们的绝对值大小,如果减数绝对值大于被减数绝对值的话要交换两者计算位置,最后求出结果后还要加上正确的符号。
根据排列组合原理,一个字长为n位的字,最多能够表示出2n种不同的二进制数码。其中,数值2n 就称为该字的模(Modulo)。用一个不是太准确但还算通俗易懂的概念解释下模。
1.将时针逆时针拨动4个小时。 3 - 4
2.将时针顺时针拨动8个小时。 3 + (12 - 8)
这里只考虑这两种情况,并且两者的结果是一样的。
而这里的12称为“模”。
也就是说,其实补码在定义时,第一位不是类似原码的符号位,这里的0、1其实表示是否借位通过模的引入加减法转换为加法,恰好计算完的结果最高有效位可以来表示正负,才有了补码的符号位这一概念注意计数器在0000状态下减1的情况,由于不够减,实际这里已经产生了借位,这时计数器的减1结果与二进制运算10000-1的结果是等价的。因此,当计数值x小于0时,计数器的内容(机器数)实际已变成如下形式:





负数的反码是有补码减1所得。
我们日常生活中比较两个数的大小是通过做减法来实现的,计算机也一样。
但是对于计算机来说,无符号数值的比较只需要通过是否借位来判断大小,而有符号的数值的大小比较却较为麻烦了。
首先,由于执行的是相加运算,借位状态没有任何意义了。
其次,计算过程中有可能因为溢出而无法表示正确的结果。
为了便于有符号数的大小比较,在计算机中常用“移码”来表示有符号数。所谓移码是指将有符号数x加上正偏移值B后所形成的无符号数,即
[x] 移 = B + x
其中,偏移值B为一个整数,它等于真值x最小数的绝对值。真值x的取值不能超出有符号机器数的表示范围。
字长为n的移码与补码之间的关系式:
[x] 移 = B + [x] 补 (mod 2 n)
其中,x为整数,其范围是-2n-1 <= x < 2n-1。B为一个正整数,在这里 B = |xmin| = 2n-1。下面列出了8位补码、移码与真值之间的对应关系。
| 真值x | 补码 | 移码 |
|---|---|---|
| 127 | 01111111 | 11111111 |
| 126 | 01111110 | 11111110 |
| … | … | … |
| 1 | 00000001 | 10000001 |
| 0 | 00000000 | 10000000 |
| -1 | 11111111 | 01111111 |
| … | … | … |
| -127 | 10000001 | 00000001 |
| -128 | 10000000 | 00000000 |
可见这里补码最高位取反就是移码,对于计算机移码来说,最高位为1的为正数,最高位为0为负数。无论是正数还是负数,大的数的补码永远是大于小的数的,故当相同符号的数值进行比较的时候移码的大小关系和真值的大小关系一样。

