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

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

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

  1. 计算机二进制转化教案及ppt,二进制和十进制之间的转换.ppt

    <二进制和十进制之间的转换.ppt>由会员分享,提供在线免费全文阅读可下载,此文档格式为ppt,更多相关<二进制和十进制之间的转换.ppt>文档请在天天文库搜索. 1.计算机中 ...

  2. java负数转换二进制表示_负数的二进制和十进制之间的转换

    负数的二进制和十进制之间的转换: 1. 十进制负数转换为二进制的方法为: 1.将十进制转换为二进制数. 2.对该二进制数求反. 3.再将该二进制数加1. 总之就是将十进制数转换为二进制数求补码即为结果 ...

  3. python 二进制与十进制之间的转换

    1.十进制 与 二进制之间的转换 (1).十进制转换为二进制,分为整数部分和小数部分 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数. ...

  4. python十进制转化为二进制_python 二进制与十进制之间的转换

    1.十进制 与 二进制之间的转换 (1).十进制转换为二进制,分为整数部分和小数部分 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数. ...

  5. python二进制转十进制编程_python 二进制与十进制之间的转换

    1.十进制 与 二进制之间的转换 (1).十进制转换为二进制,分为整数部分和小数部分 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数. ...

  6. 小朋友学C语言(23):二进制与十进制之间的转换

    在学本节之前,请先复习 小朋友学C语言(17):二进制 一.二进制转换为十进制的C语言代码 #include <stdio.h> #include <string.h>int ...

  7. 小数的二进制和十进制之间的转换

    0.125(十进制) 依次 × 2 取小数点左边第一个数,将取得的数按顺序排列在小数点右侧,例子如下: 0.125 × 2 = 0.25 0.25 × 2 = 0.5 0.5 × 2 = 1.0 0. ...

  8. 进制转换:二进制、八进制、十六进制、十进制之间的转换

    进制转换:二进制.八进制.十六进制.十进制之间的转换 不同进制之间的转换在编程中经常会用到,尤其是C语言. 将二进制.八进制.十六进制转换为十进制 二进制.八进制和十六进制向十进制转换都非常容易,就是 ...

  9. 二进制与十进制数互相转换的方法及原理

    二进制与十进制数互相转换的方法及原理 有人问我一道十进制数转化为二进制数的题:13.625转化为二进制应该如何表示.让我回忆起十多年前学编程时就搞不懂二进制,不找"不必求甚解"的借 ...

  10. c语言中十进制转化二进制八进制十六进制,进制转换:二进制、八进制、十六进制、十进制之间的转换...

    对于基础薄弱的读者,本节的内容可能略显晦涩和枯燥,如果觉得吃力,可以暂时跳过,用到的时候再来阅读.但是本节所讲的内容是学习编程的基础,是程序员的基本功,即使现在不学,迟早也要回来学. 上节我们对二进制 ...

最新文章

  1. 2012关于钱的Tips
  2. Git探秘:实用主义(1/2)
  3. POJ 3259 Wormholes(负权环路)
  4. 二十四、Struts2中的UI标签
  5. mysql分区失败_MYSQL表分区操作错误1503解决方案
  6. 如何应用AutoML加速图机器学习任务的处理?
  7. My github blog
  8. 国家网信办:督促知乎、豆瓣等20家知识社区问答平台开展自查自纠
  9. Codeforces Round #362 (Div. 2) D 树形dp
  10. Stadia云游戏平台
  11. 新浪微博技术架构分析-转载
  12. 解决微信浏览器video全屏的问题及黑边问题
  13. cpu字长、操作系统字长和jvm中各数据类型占用的字节数关系
  14. [2019HDU多校第一场][HDU 6578][A. Blank]
  15. Java web 图书管理系统
  16. 经典传染病SIS模型及仿真
  17. AC695X独立输出8路PWM+红外遥控接收
  18. Oracle收集统计信息
  19. Quantum leaps 量子,从古怪精灵到宝剑在手
  20. hd2 刷android

热门文章

  1. Sci-Hub桌面版 告别网站被封的尴尬
  2. python虚拟变量回归_虚拟变量提升多元线性回归模型精度(附Python代码与数据)...
  3. 淘宝标品运营技巧,标品如何实现小单量爆搜索
  4. 美国和欧洲5G最新进展—全球5G发展洞察2022(下)
  5. 【行业视角】是什么让元宇宙土地与房产变得有价值
  6. 关键词搜索-免费搜索关键词排名软件
  7. matlab 给图片上画框,matlab在图片上画框
  8. uni-app -- 小程序添加激励视频(字节-抖音小程序)
  9. 天南星科系统发育及全基因组复制事件的研究取得新进展
  10. C++并发编程 - 同步并发操作