admin管理员组

文章数量:1794759

十六进制表示法(二进制/十六进制/十进制之间的转换)

十六进制表示法(二进制/十六进制/十进制之间的转换)

参考资料:《深入理解计算机系统》原书第三版

现代计算机存储和处理信以二值形式表示,二进制数字也称位。一个字节由8位组成。二进制表示法中,它的值域为000000002到111111112;如果看做十进制数就是010到25510。

十六进制表示法 1

由于二进制太过冗长,十进制与位表示法转化太过麻烦,因此,用十六进制数来表示位模式较为方便。十六进制(简写成hex)使用0到9,以及A到F来表示16个可能的值。在十六进制表示法中,它的值域为0016到FF16。

十六进制数字01234567
十进制值01234567
二进制值00000001001000110100010101100111
十六进制数字89ABCDEF
十进制值89101112131415
二进制值10001001101010111100110111101111

在C语言中,以0x开头或以0X开头的数字常量被认为是十六进制的值。字符‘A’~‘F’可以是大写,也可以是小写,或者是大小写混合。在编写机器级程序的一个常见任务就是在位模式的十进制、二进制、十六进制之间的人工转换。一个简单窍门是记住十六进制数字A、C和F相应的十进制值,而对于把十六进制值B、D和E转化成十进制值,则可以通过计算它们与前三个值得相对关系来完成。

比如,假设给你一个数字0x173A4C。可以通过展开每个十六进制数字,将它转换为二进制格式,如下所示:

十六进制173A4C
二进制000101110011101001001100

反过来,如果给定一个二进制数字1111001010110110110011,可以通过首先把它分为每4位一组(从后往前)来转换为十六进制。不过要注意,如果位总数不是4得倍数,最左边得一组可以少于4位,前面用0补足。然后将每4位组转换为相应的十六进制数字:

二进制1111001010110110110011
十六进制3CADB3

练习题1 完成下面的数字转换: A.将0x39A7F8转换为二进制。 B.将二进制1100100101111011转换为十六进制。 C.将0xD5E4C转换为二进制 D.将二进制1001101110011110110101转换为十六进制。

2

当值x是2的非负整数n次幂时,也就是x=2n,我们很容易将x写成十六进制的形式。具体来讲,当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的不同次幂的十进制和十六进制表示:

n2n(十进制)2n(十六进制)
95120x200
19
16384
0x10000
17
32
0x80
3 十进制和十六进制之间的转换

十进制和十六进制表示之间的转换需要使用乘法或者除法来处理一般情况。将一个十进制数x转换成十六进制,可以反复地用16除x,得到一个商q和一个余数r,也就是x=q·16+r。然后,我们用十六进制数字表示的r作为最低位的数字,并且通过对q反复进行这个过程得到剩下的数字。例如,考虑十进制314156的转换:

314156 = 19634·16+12 (C) 19634 = 1227·16+2 (2) 1227 = 76·16+11 (B) 76 = 4·16+2 (C) 4 = 0·16+4 (4)

从这里,我们能读出十六进制表示为0x4CB2C。

反过来,将一个十六进制数字转换成十进制数字,我们可以用相应的16的幂乘以每个十六进制数字。比如,给定数字0x7AF,我们计算它对应的十进制值为 7·162+10·16+15 = 7·256+10·16+15 = 1792+160+15 =1967

练习题3 一个字节可以用两个十六进制数字来表示。填写下表中缺失的项,给出不同字节模式的十进制、二进制和十六进制的值:

十进制二进制十六进制
00000 00000x00
167
62
188
0011 0111
1000 1000
1111 0011
0x52
0xAC
0xE7
旁注:十进制和十六进制之间的转换 较大数值的十进制和十六进制之间的转换,最好是让计算机或者计算器来完成。

练习题4 不讲数字转换为十进制或者二进制,试着解答下面的算术题,答案要用十六进制表示。提示:只要将执行十进制加减法所使用的方法改成以16为基数。(逢10进1变为逢16进1)(二进制同样的道理:逢2进1) A. 0x503c + 0x8 = ___________ B. 0x503c - 0x40 = ___________ C. 0x503c + 64 = ___________ D. 0x50ea - 0x503c = __________

练习题答案

练习题1

在我们开始查看机器级程序的时候,理解十六进制和二进制格式之间的关系将是很重要的。 A. 将0x39A7F8转换成二进制:

十六进制 3 9 A 7 F 8 二进制 0011 1001 1010 0111 1111 1000

B. 将二进制1100100101111011转换成十六进制:

二进制 1100 1001 0111 1011 十六进制 C 9 7 B

C. 将0xD5E4C转换成二进制:

十六进制 D 5 E 4 C 二进制 1101 0101 1110 0100 1100

D. 将二进制1001101110011110110101转换成十六进制:

二进制 10 0110 1110 0111 1011 0101 十六进制 2 6 E 7 B 5

练习题2 这个问题给你一个机会思考2的幂和它们的十六进制表示。

n2n(十进制)2n(十六进制)
95120x200
19524 288800000x
1416 3840x4000
1665 5360x10000
17131 0720x20000
5320x20
71280x80

练习题3 这个问题给你一个机会试着对一些小的数在十六进制和十进制表示之间进行转换。对于较大的数,使用计算器或者转换程序会更加方便和可靠。

十进制二进制十六进制
00000 00000x00
167=10·16+71010 01110xA7
62=3·16+140011 11100X3E
188=11·16+121011 11000XBC
3·16+7=550011 01110X37
8·16+8=1361000 10000X88
15·16+3=2431111 00110XF3
5·16+2=820101 00100x52
10·16+12=1721010 11000xAC
14·16+7=2311110 01110xE7

练习题4 当开始调试机器级程序时,你将发现在许多情况中,一些简单的十六进制运算是很有用的。可以总是把数转换成十进制,完成运算,再把它们转换回来,但是能够直接用十六进制工作更加有效,而且能够提供更多的信。

A. 0x503c+0x8=0x5044。8加上十六进制c得到4并且进位1。 B. 0x503c-0x40=0x4ffc。在第二个位数,3减去4要从第三位借1。因为第三位是0,所以我们必须从第四位借位。 C. 0x503c+64=0x507c。十进制64(2的6次方)等于十六进制0x40。 D. 0x50ea-0x503c=0xae。十六进制数a(十进制数10)减去十六进制数c(十进制数12),我们从第二位借16, 得到十六进制数e(十进制数14)。在第二个数位,我们现在用十六进制d(十进制13)减去3,得到十六进制a(十进制10)。

本文标签: 十六进十六进制十进制