2.1.1 十六进制表示法

标签:
it |
分类: C |
2.1.1 十六进制表示法
一个字节由8位组成。在二进制表示法中,它的值域是000000002~111111112;如果用十进制整数表示,它的值域就是010~25510。两种表示法对于描述位模式来说都不是非常方便。二进制表示法太冗长,而十进制表示法与位模式的互相转化又很麻烦。替代的方法是,以16为基数,或者叫十六进制(hexadecimal)数,来表示位模式。十六进制(简写为“hex”)使用数字‘0’~‘9’,以及字符‘A’~‘F’来表示16个可能的值。图2-2展示了16个十六进制数字对应的十进制值和二进制值。用十六进制书写,一个字节的值域为0016~FF16。
在C语言中,以0x或0X开头的数字常量被认为是十六进制的值。字符‘A’~‘F’既可以是大写,也可以是小写,甚至是大小写混合。例如,我们可以将数字FA1D37B16写作0xFA1D37B,或者0xfald37b,也可以写作0xFa1D37b。在本书中,我们将使用C表示法来表示十六进制值。
http://images.51cto.com/files/uploadimg/20101103/143832906.jpg |
编写机器级程序的一个常见任务就是在位模式的十进制、二进制和十六进制表示之间人工进行转换。二进制和十六进制之间的转换比较简单直接,因为可以一次执行一个十六进制数字的转换。数字的转换可以参考如图2-2所示的表。一个简单的窍门是,记住十六进制数字A、C和F相对应的十进制值。而对于把十六进制值B、D和E转换成十进制值时,则可以通过计算它们与前三个值的相对关系来完成。
比如,假设给你一个数字0x173A4C,可以通过展开每个十六进制数字,将它转换为二进制格式,如下所示:
http://images.51cto.com/files/uploadimg/20101103/143922326.jpg |
当值x是2的非负整数n次幂时,也就是x = 2n,我们可以很容易地将x写成十六进制形式,只要记住x的二进制表示就是1后面跟n个0。十六进制数字0代表4个二进制0。所以,当n表示成i + 4j的形式,其中0≤i≤3时,我们可以把x写成开头的十六进制数字为1(i = 0)、2(i = 1)、4(i = 2)或者8(i = 3),后面跟随着j个十六进制的0。比如,x = 2048 = 211,我们有n = 11 = 3 + 4×2,从而得到十六进制表示0x800。
练习题2.2 填写下表中的空白项,给出2的不同次幂的二进制和十六进制表示:
http://images.51cto.com/files/uploadimg/20101103/144039916.jpg |
十进制和十六进制表示之间的转换需要使用乘法或者除法来处理一般情况。将一个十进制数字x转换为十六进制,可以反复地用16除x,得到一个商q和一个余数r,也就是x = q×16 + r。然后,我们用十六进制数字表示的r作为最低位数字,并且通过对q反复进行这个过程得到剩下的数字。例如,考虑十进制314156的转换:
http://images.51cto.com/files/uploadimg/20101103/144105129.jpg |
从这里,我们能读出十六进制表示为0x4CB2C。
反过来,将一个十六进制数字转换为十进制数字,我们可以用相应的16的幂乘以每个十六进制数字。比如,给定数字0x7AF,我们计算它对应的十进制值为7×162
+ 10×16 + 15=7×256 +
练习题2.3 一个字节可以用两个十六进制数字来表示。填写下表中缺失的项,给出不同字节模式的十进制、二进制和十六进制值。
http://images.51cto.com/files/uploadimg/20101103/144144876.jpg |
十进制和十六进制间的转换
较大数值的十进制和十六进制之间的转换,最好是让计算机或者计算器来完成。例如,下面的Perl语言脚本将(命令行给出的)一列数字从十进制转换为十六进制:
http://images.51cto.com/files/uploadimg/20101103/144403859.jpg |
http://images.51cto.com/files/uploadimg/20101103/144428556.jpg |