Skip to content

为什么会使用十六进制?它比二进制、十进制好在哪里?

更新: 7/30/2026 字数: 0 字 时长: 0 分钟

你可能没写过底层代码,但大概率见过这样的东西:

css
color: #FF6600;
background-color: #FFFFFF;

网页颜色码里的 #FF6600,就是一个典型的十六进制写法。

如果把它拆开看:

text
#FF6600 = 红色 FF,绿色 66,蓝色 00

其中:

  • FF 表示红色强度很高;
  • 66 表示绿色有一定强度;
  • 00 表示蓝色没有强度。

为什么不用我们更熟悉的十进制?为什么计算机底层明明是二进制,却又经常出现十六进制?答案很简单:

二进制适合机器,十进制适合人类日常,十六进制适合人类阅读和书写机器数据。

十六进制:机器语言与人类阅读之间的折中

一、三种数制的基本对应关系

1. 十进制:我们最熟悉的计数方式

十进制使用 10 个符号:

text
0 1 2 3 4 5 6 7 8 9

逢十进一。

比如:

text
9 后面是 10
99 后面是 100

它非常适合日常生活:

  • 价格:99 元;
  • 年龄:18 岁;
  • 距离:100 公里;
  • 数量:30 个。

十进制的优势是符合人类习惯,但它并不是计算机硬件最自然的表达方式。

2. 二进制:计算机最自然的语言

二进制只使用 2 个符号:

text
0 1

逢二进一。

它看起来比较反人类,但对计算机非常自然,因为硬件中很多状态都可以抽象成两种:

text
低电平 / 高电平
关 / 开
假 / 真
0 / 1

例如十进制的 13,用二进制表示是:

text
13 = 1101

二进制适合机器处理,但有一个明显问题:

写起来太长,读起来太累。

比如十进制的 255,二进制是:

text
11111111

如果是更大的数据,就会变成一长串 01,人很容易看错、数错。

3. 十六进制:更短、更适合看机器数据

十六进制使用 16 个符号:

text
0 1 2 3 4 5 6 7 8 9 A B C D E F

其中:

text
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15

也就是:

text
十进制 15 = 十六进制 F
十进制 16 = 十六进制 10

它的关键优势在于:

1 个十六进制位,刚好可以表示 4 个二进制位。

对应关系如下:

text
二进制 0000 = 十六进制 0
二进制 0001 = 十六进制 1
二进制 0010 = 十六进制 2
二进制 0011 = 十六进制 3
二进制 0100 = 十六进制 4
二进制 0101 = 十六进制 5
二进制 0110 = 十六进制 6
二进制 0111 = 十六进制 7
二进制 1000 = 十六进制 8
二进制 1001 = 十六进制 9
二进制 1010 = 十六进制 A
二进制 1011 = 十六进制 B
二进制 1100 = 十六进制 C
二进制 1101 = 十六进制 D
二进制 1110 = 十六进制 E
二进制 1111 = 十六进制 F

所以:

text
二进制:1111 1111
十六进制:FF
十进制:255

同一个数,十六进制比二进制短很多,同时又能非常容易地和二进制对应起来。

二、十六进制的对比优势

1. 比二进制短得多

看一个 8 位二进制数:

text
11111111

如果写成十六进制:

text
FF

长度从 8 位变成 2 位。

再看一个 32 位二进制数:

text
11011110101011011011111011101111

如果按 4 位一组切开:

text
1101 1110 1010 1101 1011 1110 1110 1111

再转成十六进制:

text
DEADBEEF

一下就短了很多,也更方便阅读、复制和检查。

这就是为什么你经常在程序、调试器、内存地址里看到类似:

text
0x7FFE
0xFF
0xDEADBEEF

这里的 0x 通常表示“后面是十六进制”。

2. 比十进制更贴近二进制

十进制虽然人类熟悉,但它和二进制之间没有那么整齐的分组关系。

比如:

text
255

你看到十进制 255,不一定能马上知道它的二进制是:

text
11111111

但看到十六进制:

text
FF

如果你知道:

text
F = 1111

那么:

text
FF = 1111 1111

这就很直观。

所以十六进制的定位不是取代十进制,而是:

当我们需要阅读计算机内部数据时,十六进制比十进制更顺手。

3. 天然适合表示字节

计算机里很常见的单位是 字节 byte

一个字节等于 8 个二进制位:

text
1 byte = 8 bits

而:

text
1 个十六进制位 = 4 bits

所以:

text
1 byte = 2 个十六进制位

这就非常整齐。

例如一个字节的最大值:

text
二进制:11111111
十进制:255
十六进制:FF

所以在查看文件内容、网络数据包、颜色值、编码数据时,十六进制非常常见。

三、十六进制的典型适用场景

场景 1:网页颜色码

网页颜色常见写法是:

text
#RRGGBB

其中:

  • RR 表示红色;
  • GG 表示绿色;
  • BB 表示蓝色。

每一组都是 2 位十六进制,也就是 1 个字节,范围是:

text
00 到 FF

换成十进制就是:

text
0 到 255

例如:

text
#000000 = 黑色
#FFFFFF = 白色
#FF0000 = 红色
#00FF00 = 绿色
#0000FF = 蓝色
#FF6600 = 橙色

为什么颜色码适合用十六进制?

因为每个颜色通道正好是 1 个字节,而 1 个字节正好可以用 2 位十六进制表示。

text
红色 255 = FF
绿色 102 = 66
蓝色 0 = 00

所以:
RGB(255, 102, 0) = #FF6600

场景 2:内存地址

程序运行时,数据会放在内存里。内存中的位置通常用地址表示。

如果用二进制写地址,会非常长:

text
01111111111111100010101000010000

但用十六进制就短得多:

text
0x7FFE2A10

这对开发者很重要,因为调试程序时,经常需要看:

  • 某个变量在哪里;
  • 某段内存是否被改动;
  • 指针指向什么位置;
  • 崩溃日志中的地址信息。

十六进制的好处是:

  • 比二进制短;
  • 比十进制更容易和字节、位模式对应;
  • 更适合调试器和日志展示。

场景 3:文件内容查看

如果你用十六进制查看器打开一个文件,可能会看到类似:

text
89 50 4E 47 0D 0A 1A 0A

这类内容叫做文件的“字节数据”。

为什么不用普通文本显示?

因为文件底层不一定都是可见字符。图片、压缩包、音频、视频、可执行文件,很多内容直接显示出来会是乱码。

十六进制查看器的作用是:

把文件中的每个字节,用两位十六进制稳定地显示出来。

这样开发者就能检查:

  • 文件头是否正确;
  • 编码是否异常;
  • 数据是否损坏;
  • 协议字段是否符合预期。

场景 4:网络数据包

网络通信本质上也是一串字节。

例如一段数据包可能被显示成:

text
45 00 00 3C 1C 46 40 00

用十六进制展示网络数据,有几个好处:

  • 每两个十六进制字符对应一个字节;
  • 字段边界更清楚;
  • 便于和协议文档对照;
  • 比二进制更容易人工阅读。

比如协议文档里说某字段占 1 字节,那你看到:

text
3C

就知道这正好是一个字节,而不是一长串 00111100

场景 5:机器码、编码与底层调试

在底层开发、嵌入式、驱动、编译器、逆向分析、硬件调试里,十六进制也非常常见。

例如:

text
0x00
0x7F
0x80
0xFF

这些值在底层语境里非常直观:

  • 0x00:所有位都是 0;
  • 0xFF:一个字节的所有位都是 1;
  • 0x7F:二进制最高位是 0,后面都是 1;
  • 0x80:二进制最高位是 1,后面都是 0。

如果换成十进制:

text
0
127
128
255

虽然也正确,但不如十六进制容易看出每一位的结构。

四、什么时候不用十六进制?

十六进制很有用,但不是所有场景都适合它。

日常计算:用十进制

比如:

  • 工资;
  • 价格;
  • 成绩;
  • 日期;
  • 距离;
  • 统计数据。

这些场景用十进制最自然,因为人类已经习惯了。

你不会说:

text
这件商品售价 0x63 元

虽然 0x63 等于十进制 99,但这会让人很困惑。

机器电路和逻辑:用二进制

如果你关心的是每一位到底是 0 还是 1,比如:

  • 位运算;
  • 开关状态;
  • 权限标志;
  • 硬件寄存器;
  • 布尔逻辑。

二进制更直观。

例如:

text
权限标志:1011

可以理解为:

text
第 1 位:开
第 2 位:开
第 3 位:关
第 4 位:开

这种情况下,二进制能直接展示每个位的状态。

机器数据阅读:用十六进制

如果你面对的是一段机器数据,比如:

  • 内存;
  • 字节流;
  • 文件头;
  • 颜色码;
  • 网络包;
  • 编码数据。

十六进制通常最合适。

它不像二进制那样冗长,也不像十进制那样和字节边界不够整齐。

五、一个简单类比

可以把三种数制想象成三种语言:

text
二进制:机器的母语
十进制:人类日常语言
十六进制:程序员查看机器数据时的速记法

十六进制存在的意义,不是因为它“更高级”,而是因为它刚好卡在一个很舒服的位置:

  • 能和二进制整齐对应;
  • 写起来比二进制短;
  • 看机器数据比十进制清楚;
  • 又没有复杂到难以学习。

六、三种数制适用场景对比表

二进制、十进制、十六进制适用场景

数制使用符号核心特点更适合谁典型场景举例
二进制0、1最贴近计算机硬件状态机器、硬件、底层逻辑位运算、开关状态、权限标志、寄存器11111111
十进制0–9最符合人类日常习惯普通用户、业务计算金额、数量、年龄、统计数据255
十六进制0–9、A–F1 位对应 4 个二进制位,短且整齐程序员、调试者、数码爱好者颜色码、内存地址、文件字节、网络包FF

总结一句话:

看机器内部,二进制最原始;给人日常使用,十进制最自然;在二者之间做阅读和调试,十六进制最顺手。