参考资料:《深入理解计算机系统》原书第三版
现代计算机存储和处理信息以二值形式表示,二进制数字也称位。一个字节由8位组成。二进制表示法中,它的值域为000000002到111111112;如果看做十进制数就是010到25510。
十六进制表示法
1
由于二进制太过冗长,十进制与位表示法转化太过麻烦,因此,用十六进制数来表示位模式较为方便。十六进制(简写成hex)使用0到9,以及A到F来表示16个可能的值。在十六进制表示法中,它的值域为0016到FF16。
十六进制数字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
十进制值 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
二进制值 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
十六进制数字 | 8 | 9 | A | B | C | D | E | F |
十进制值 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
二进制值 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
在C语言中,以0x开头或以0X开头的数字常量被认为是十六进制的值。字符‘A’~‘F’可以是大写,也可以是小写,或者是大小写混合。在编写机器级程序的一个常见任务就是在位模式的十进制、二进制、十六进制之间的人工转换。一个简单窍门是记住十六进制数字A、C和F相应的十进制值,而对于把十六进制值B、D和E转化成十进制值,则可以通过计算它们与前三个值得相对关系来完成。
比如,假设给你一个数字0x173A4C。可以通过展开每个十六进制数字,将它转换为二进制格式,如下所示:
十六进制 | 1 | 7 | 3 | A | 4 | C |
---|---|---|---|---|---|---|
二进制 | 0001 | 0111 | 0011 | 1010 | 0100 | 1100 |
反过来,如果给定一个二进制数字1111001010110110110011,可以通过首先把它分为每4位一组(从后往前)来转换为十六进制。不过要注意,如果位总数不是4得倍数,最左边得一组可以少于4位,前面用0补足。然后将每4位组转换为相应的十六进制数字:
二进制 | 11 | 1100 | 1010 | 1101 | 1011 | 0011 |
---|---|---|---|---|---|---|
十六进制 | 3 | C | A | D | B | 3 |
练习题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的不同次幂的十进制和十六进制表示:
n | 2n(十进制) | 2n(十六进制) |
---|---|---|
9 | 512 | 0x200 |
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 一个字节可以用两个十六进制数字来表示。填写下表中缺失的项,给出不同字节模式的十进制、二进制和十六进制的值:
十进制 | 二进制 | 十六进制 |
---|---|---|
0 | 0000 0000 | 0x00 |
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的幂和它们的十六进制表示。
n | 2n(十进制) | 2n(十六进制) |
---|---|---|
9 | 512 | 0x200 |
19 | 524 288 | 800000x |
14 | 16 384 | 0x4000 |
16 | 65 536 | 0x10000 |
17 | 131 072 | 0x20000 |
5 | 32 | 0x20 |
7 | 128 | 0x80 |
练习题3
这个问题给你一个机会试着对一些小的数在十六进制和十进制表示之间进行转换。对于较大的数,使用计算器或者转换程序会更加方便和可靠。
十进制 | 二进制 | 十六进制 |
---|---|---|
0 | 0000 0000 | 0x00 |
167=10·16+7 | 1010 0111 | 0xA7 |
62=3·16+14 | 0011 1110 | 0X3E |
188=11·16+12 | 1011 1100 | 0XBC |
3·16+7=55 | 0011 0111 | 0X37 |
8·16+8=136 | 1000 1000 | 0X88 |
15·16+3=243 | 1111 0011 | 0XF3 |
5·16+2=82 | 0101 0010 | 0x52 |
10·16+12=172 | 1010 1100 | 0xAC |
14·16+7=231 | 1110 0111 | 0xE7 |
练习题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)。
今天的文章十六进制对应的二进制表_16进制转换为二进制简单方法分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84059.html