在数学计算中,二进制计数系统的公分母是最小的,它以2为基数。你还记得在小学或中学时所学的不一样的计数系统吗?笔者在上小学时,曾在一堂数学课中学过以6为基数的计数系统;你先数1,2,3,4,5,而后是10,11,12,13,14,15,而后是20,等等,实际上,应该先数0,1,2,3,4,5,而后是10,1l,12,13,14,15,等等。从O开始数,能比较清楚地看出每6个数字组成一组——所以6就是基数。注意,你应该从O开始一块儿数到比基数小1的数(由于基数是6,因此你应该从O数到5)。当你数到5后,接着应该开始数两位数。若是你思考一下,你就会发现这与以10为基数(十进制)的计数系统是相似的——在你数到比基数小1的数(9)后,就转到两位数,并继续往下数。
计算机中的计数系统以2为基数——即二进制。因为以2为基数,因此你先数O,1,而后是10,11,而后是100,101,110,111,而后是1000,1001,1010,1011,1100,1101,1110,1111,等等。与以6为基数时不一样,在以2为基数时,在数到两位数以前,只需从O数到1。
那么,为何在计算机中要以2为基数呢?其缘由在于计算机中使用了晶体管。晶体管使现代计算机的出现成为可能。晶体管就象电灯开关,电灯开关有“开”和“关”两种状态,晶体管也是如此。你能够认为“关”表示0,“开”表示1,这样,你就能够用一个晶体管(若是你愿意,也能够用一个电灯开关)来进行从。到1的计数了。仅仅使用两个数字(O到1)还不能作任何复杂的计算,可是咱们还能够继续下去。假设有一个电灯开关控制面板,上面有4个大电灯开关,尽管每一个开关只有两种状态,可是这些开关组合起来就会有16或2。(4个开关,每一个2种状态)种不一样的状态。这样,你就能够用4个开关来进行从。到15的计数了,见表20.22。
表20.22 进制计数
-------------------------------------------------------
开关 十进制值 幂
-------------------------------------------------------
O O
1 1 20
10 2 21
11 3
100 4 22
101 5
110 6
111 7
1000 8 23
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15
-------------------------------------------------------
上表说明了很重要的三点:
经过把开关并排放在一块儿,你就能够用它们来计数了——在本例中最多能够数到15(总共16次计数);
你能够把每一个开关看做是一个二进制位,就象十进制系统中的十进制位同样;
若是每一个开关都表明一个二进制位,那么它们恰好也都表明一个2的幂(20,21,22,23,等等)。
此外,请注意,在表中出现2的幂的地方,计数结果就要增长一个二进制位。这与十进制系统是相同的,每增长一个十进制位时,这个新的十进制位也正是一个10的幂(1=100,10=101,100=102,等等)。明白了这一点后,你就能够很容易地把二进制数转换为十进制数了,例如,二进制数10111就是(1×24)+(O×23)+(1×22)+(1×21)+(1×20),它等于十进制的(16+0+4+2+1)或23。10 1110 1011,一个大得多的二进制数,就是(1×29)+(O×28)+(1×27)+(1×26)+(1×25)+(0×24)+(1×23)+(O×22)+(1×21)+(1×20),它等于十进制的(512+0+128+64+32+0+8+0+2+1)或747。
那么全部这些和咱们有什么关系呢?在计算机领域中,存在着位(bit),半字节(nibble)和字节(byte)。一个半字节是4位,一个字节是8位。什么是一个位呢?它就是一个晶体管。所以,一个字节就是8个相邻的晶体管,就象表20.1中的4个开关同样。记住,若是你有4个组合在一块儿的开关(或晶体管),你就能够数24或16,你能够把这看做是由开关组成的一个半字节。若是一个半字节是4个晶体管组合在一块儿,那么一个字节就是8个晶体管组合在一块儿。你能够用8个晶体管数到2。或256,从另外一个角度看,这意味着一个字节(含8个晶体管)能够表示256个不一样的数字(从0到 255)。再深刻一点,Intel 386,486和Pentium处理器被叫作32位处理器,这意味着这些Intel芯片所进行的每一次运算都是32位宽或32个晶体管宽的。32个晶体管,或32位,等价于232或4,294,967,296,即它们能表示超过40亿个不一样的数字。
固然,上述介绍还不能解释计算机是如何利用这些数字产生那种神奇的计算能力的,但它至少解释了计算机为何要使用以及是如何使用二进制计数系统的。
什么是八进制?
八进制是以8为基数的一种计数系统。在八进制系统中,你是这样计数的:O,1,2,3,4,5,6,7,10,ll,12,13,等等。下面比较了八进制(第二行)和十进制(第一行)中的计数过程:
O,l,2,3,4,5,6,7,8,9,10.11,12,13,14,15,16
0,1,2.3,4,5,6,7,10,11,12,13,14,15,16,17,20
注意,在八进制中,在数到7后,就要增长一个八进制位,第二个八进制位显然就是8?(等于十进制的8)。若是你数到第三个八进制位(八进制的100),那将是8?或十进制的64,所以,八进制的100等于十进制的64。
如今,八进制已经不象之前那样经常使用了,这主要是由于如今的计算机使用的是8,16,32或64位处理器,最适合它们的计数系统是二进制或十六进制(见20.24中有关十六进制计数系统的介绍)
C语言支持八进制字符集,这种字符要用反斜杠字符来标识。例如,在C程序中,下面的语句并很多见:
if(x=='\007')break;
这里的"\007"刚好就是ASCII值为7的字符;该语句用来检查终端鸣笛字符。另外一个常见的八进制数是"\033",即Escape字符(在程序中它一般表示为"\033")。然而,八进制数如今已经不多见了——它们被十六进制数代替了。
什么是十六进制?
十六进制(hexadecimal,缩写为hex)是以16为基数的计数系统,它是计算机中最经常使用的计数系统。十六进制中的计数过程为:O,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,等等。十六进制中的字母是几个单位数标识符,表示十进制的10到15。要记住在不一样基数下的计数规则,即从O数到比基数小1的数字,在十六进制中这个数就是十进制的15。由于西式数字中没有表示大于9的单位数,因此就用A,B,c,D,E和F来表示十进制的10到15。在十六进制中,数到F以后,就要转到两位数上,也就是1OH或Ox1O。下面对十六进制(第二行)和十进制(第一行)的计数过程做一下比较:
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,……
1,2,3,4,5,6,7,8,9,A, B, C, D, E, F, 10,……
注意,十进制的10等于十六进制的A。与前面讨论过的计数系统同样,每增长一个十六进制位,实际上就增长了一个16的幂,即160(1),161(16),162(256),163(4096),等等。所以,十六进制数3F能够展开为(3×161)+(F×160),等于十进制的(48+15)或63;十六进制数13F能够展开为(1×162)+(3×161)+(F×160),等于十进制的(256+48+15)或319。在c程序中,这两个数用0x3F或Oxl3F这样的形式来表示,其中的“0x”前缀用来告诉编译程序(和程序员)该数字应被看成十六进制数来处理。若是不加“0x”前缀,你就没法判断一个数到底是十六进制数仍是十进制数(或者是八进制数)。
对表20.22稍做改进,加入十六进制的计数过程,就获得了表20.24:
—————————————————————————————————
二进制 十进制值 二进制幂 十六进制 十六进制幂
—————————————————————————————————
0000 O O
0001 1 20 1 160
0010 2 21 2
0011 3 3
0100 4 22 4
0101 5 5
0110 6 6
0111 7 7
1000 8 23 8
1001 9 9
1010 10 A
1011 11 B
1100 12 C
1101 13 D
1110 14 E
1111 15 F
10000 16 24 10 161 ————————————————————————————————— 笔者在上表的最后又加了一行,使计数达到十进制的16。经过比较二进制、十进制和十六进制·你就会发现:“十”在二进制中是“1010”,在十进制中是“10”,在十六进制中是“A”;。。十六”在二进制中是“1 0000"或“10000”,在十进制中是“16”,在十六进制中是“1O”,,(见上表的最后一行)。这意味着什么呢?由于今天的16,32和64位处理器的位宽刚好都是16的倍数,因此在这些类型的计算机中用十六进制做为计数系统是很是合适的。 十六进制位和二进位之间有一种“倍数”关系。在上表的最后一行中,二进制值被分为两部分(1 0000)。4个二进制位(或者4位)能够计数到15(包括O在内共16个不一样的数字),而4位(bit)正好等于一个半字节(nibble)。在上表中你还能够发现,一个十六进制位一样能够计数到15(包括。在内共l 6个不一样的数字),所以,一个十六进制位能够表明4个二进制位。一个很好的例子就是用二进制表示十进制的15和16,在二进制中,十进制的15就是1111,正好是4个二进制位能表示的最大数字;在十六进制中,十进制的15就是F,也正好是一个十六进制位能表示的最大数字。十进制的16要用5个二进制位(1 0000)或两个十六进制位(10)来表示。下面把前文提到过的两个数字(0x3F和0x13F)转换为二进制: 3F 111111 l3F 100111111 若是把前面的空格换为O,而且把二进制位分红4位一组,那么看起来就会清楚一些: 3F 0 0011 1111 l3F 1 0011 1111 你并不必定要把二进制位分红4位一组,只不过当你明白了4个二进制位等价于一个十六进制位后,计数就更容易了。为了证实上述两组数字是相等的,能够把二进制值转换为十进制值(十六进制值到十进制值的转换已经在前文中介绍过了);二进制的111111就是(1×25)+(1×24)+(1×23)+(1×22)+(1×21)+(1×20),等于十进制的(32+16+8+4+2+1)或63,与0x3F的转换结果相同。二进制的1 0011 1111就是(1×28)+(O×27)+(0×26)+(1×25)+(1×24)+(1×23)+(1×22)++(1×21)+(1×20),等于十进制的(256+32+1 6+8+4+2+1)或319。所以,十六进制和二进制能象手掌和手套那样相互匹配。