目录
人们使用很多计数系统来表示数字。
有些计数系统(如罗马数字)并不适合用于算数运算;而印度技术系统经过改进,传入欧洲后变成了阿拉伯计数系统,这种数字方便了数学、科学和商业计算。
现代的计算机技术系统是基于占位符概念的,使用了最先出现在印度计数系统中的零。
虽然在日常生活中使用的是十进制,但计算领域通常使用八进制、十六进制和二进制。
十进制数
数字的书写方式是基于10的幂数。例如,对于数字2468,2表示2个1000,4表示4个100,6表示6个10,8表示8个1。
2468 = 2 x 1000 + 4 x 100 + 6 x 10 + 8 x 1
一千是10x10x10或10的3次幂,用10³表示。使用这种表示法,可以这样书写上述关系:
2468 = 2 x 10³ + 4 x 10² + 6 x 10¹ + 8 x 10º
因为这种数字表示法是基于 10的幂,所以将它称作基数为10的表示法或十进制表示法。可以
用任何数作基数。例如,C++允许使用基数8(八进制)和基数16(十六进制)来书写整数(请注
意,10º为1,任何非零数的0次幂都为1)。
八进制整数
八进制数是基于8的幂的,所以基数为8的表示法用数字0-7来书写数字。C++用前缀0来表示八进制表示法。也就是说,0177是一个八进制值。可以用8的幂来找到对应的十进制值:
八进制 | 十进制 |
---|---|
177 | = 1 x 8² + 7 x 8¹ + 7 x 8º |
= 1 x 64 + 7 x 8 + 7 x 1 | |
= 127 |
由于 UNIX 操作系统常使用八进制来表示值,因此 C++和C提供了八进制表示法。
十六进制数
十六进制数是基于16的幂的。这意味着十六进制的10表示16+0,即16。为表示 9-16值,需要
其他一些数字,标准的十六进制表示法使用字母 a-f。C++接受这些字符的大写和小写版本,如下表所示。
十六进制数 | 十进制值 |
---|---|
a 或 A | 10 |
b 或 B | 11 |
c 或 C | 12 |
d 或 D | 13 |
e 或 E | 14 |
f 或 F | 15 |
C++使用0x或 0X 来指示十六进制表示法。因此 0x2B3 是一个十六进制值,可使用 16 的幂来得到对应的十进制值。
十六进制 | 十进制 |
---|---|
0x2B3 | = 2 x 16² + 11 x 16¹ + 3 x 16º |
= 2 x 256 + 11 x 16 + 3 x 1 | |
= 691 |
硬件文档常使用十六进制来表示诸如内存单元和端口号等值。
二进制数
不管是使用十进制、八进制,还是十六进制表示法来书写整数,计算机都将它存储为二进制值(即基数为 2)。二进制表示法只使用两个数字——0和1。例如,10011011就是二进制数。二进制数是基于2的幂。
二进制 | 十进制 |
---|---|
10011011 | = 1 x 2⁷ + 0 x 2⁶ + 0 x 2⁵ + 1 x 2⁴ + 1 x 2³ + 0 x 2² + 1 x 2¹ + 1 x 2º |
= 128 + 0 + 0 + 16 + 8 + 0 + 2 + 1 | |
= 155 |
二进制表示法与计算机内存完全对应,在内存中,每个单元(位)都可以设置成开或关。只是将关表示为0,将开表示为1。内存通常是以字节为单位组织的,每个字节包含8位。字节中的位被编号,对应于相关的2的幂。这样,最右侧的位编号为0,然后是1,依此类推。例如,下图表示一个2字节的整数。
二进制和十六进制
十六进制表示法常用于提供更为方便的二进制数据(如内存地址或存储位标记设置的整数)视图。这样做的原因是,每个十六进制位对应于4位。这种对应关系如下表所示。
十六进制数和对应的二进制数
十六进制位 | 对应的二进制数 |
---|---|
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
A | 1010 |
B | 1011 |
C | 1100 |
D | 1101 |
E | 1110 |
F | 1111 |
要将十六进制值转换为二进制,只需将每个十六进制位替换为相应的二进制数即可。例如,十六进制0xA4 对应于二进制数10100100。同样,可以经松地将二进制值转换为十六进制,方法是将每4位转换为对应的十六进制位。例如,二进制值10010101将被转换为0x95。