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

本文详细介绍了十六进制、二进制之间的转换规则,如何在C语言中表示,并通过实例演示了如何将十六进制转换为二进制和反之。还探讨了十进制与十六进制的转换方法,以及在计算机系统中进行数值运算的技巧。适合程序员理解和实践基础编码操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

现代计算机存储和处理信息以二值形式表示,二进制数字也称位。一个字节由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)。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值