十六进制
定义
十六进制是一种以 16 为基数的进位计数系统,其数字符号集合由 0 至 9 与 A 至 F 共 16 个字符构成,其中 A 至 F 依次对应十进制的 10 至 15[1]。与其他数制一样,它由基数和位权两个要素决定,各位的权值为 16 的幂次,运算规则为逢十六进一、借一当十六[1]。字母大小写不区分,a 与 A 表示同一数值[3]。
由于十六进制本身没有统一的书写约定,不同系统和语言采用不同的标记方式加以区别:C 语言及其衍生语言使用前缀 0x,汇编语言常用后缀 H,也可以用下标 16 表示[4]。以十进制数 57 为例,其二进制形式为 111001,十六进制形式则写作 39[2]。
原理
十六进制的核心性质在于 16 是 2 的 4 次方,因此每一位十六进制数字恰好对应 4 位二进制数字,这种对应关系是逐位一一对应的,不需要经过十进制中转[5]。一个字节包含 8 位,正好可以用 2 位十六进制数完整表示,8 位二进制 01001010 即写作 0x4a[5]。正因如此,任何以 2 的幂为基数的进制都有类似性质,而十六进制被选中,部分原因是 4 能整除绝大多数计算机的字长,8、16、32、64 位皆为 4 的倍数[5]。
将 d 位十六进制数换算为十进制,可按权展开求和:$N = \sum_{i=0}^{d-1} n_i \times 16^i$,其中字母位按其对应整数 10 至 15 代入[5]。以 E5A 为例,计算为 $14 \times 16^2 + 5 \times 16^1 + 10 \times 16^0$,结果为 3674[6]。反向换算时,十六进制与二进制之间以小数点为界向两侧每 4 位分组,不足 4 位者补 0;十进制整数转十六进制则采用除 16 取余、余数逆序排列的方法[1]。
flowchart LR
A["十进制整数"] -->|除 16 取余,逆序排列| B["十六进制"]
B -->|每位展开为 4 位二进制| C["二进制"]
C -->|每 4 位一组| B
B -->|按权 16 的幂展开求和| A
下表列出 0 至 15 在三种数制中的对应关系[7]:
| 十进制 | 二进制 | 十六进制 |
|---|---|---|
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| 2 | 0010 | 2 |
| 3 | 0011 | 3 |
| 4 | 0100 | 4 |
| 5 | 0101 | 5 |
| 6 | 0110 | 6 |
| 7 | 0111 | 7 |
| 8 | 1000 | 8 |
| 9 | 1001 | 9 |
| 10 | 1010 | A |
| 11 | 1011 | B |
| 12 | 1100 | C |
| 13 | 1101 | D |
| 14 | 1110 | E |
| 15 | 1111 | F |
发展历程
十六进制式的进位方式在计算机出现之前已有应用。清代及更早时期,中国重量单位实行 16 两为 1 斤的制度,8 两即半斤,二五型算盘可用于此类十六进制的加减运算[1]。不过这一用法与后世计算机中的十六进制表示并无直接传承关系。
早期计算机对 10 至 15 这 6 个数值的符号选择并不统一。20 世纪 50 年代,有系统用 0 至 5 加顶横线表示这些值,本迪克斯 G-15 使用 U 至 Z,利伯拉斯科普 LGP-30 使用 F、G、J、K、Q、W,苏联可编程计算器则使用西里尔字母等符号[8]。
目前通用的 A 至 F 表示法在 1966 年取得标准地位,这一变化与 IBM System/360 的 Fortran IV 手册发布有关,该手册首次认可在输入中使用十六进制常数[1]。此后这一符号体系随编程语言和文档规范扩散,成为事实上的通行写法。
应用
在计算机工程中,十六进制主要用于把冗长的二进制串压缩为便于人阅读和校对的形式。微机的机器码、内存地址、寄存器内容通常以十六进制书写,汇编语言源代码中的数也普遍使用 H 后缀[7]。32 位二进制数 00111101110011001100110011001101 可简写为 8 位十六进制数 3DCCCCCD,长度缩短为原来的四分之一[9]。
网页与图形设计是十六进制最直观的应用场景之一。CSS 用井号后接 6 位十六进制数字表示 sRGB 颜色,前两位为红色分量、中间两位为绿色、最后两位为蓝色,每对取值 00 至 ff,对应十进制 0 至 255,共可表示 16777216 种颜色[10]。该语法另有 3 位、4 位与 8 位形式,其中 8 位形式的末两位表示透明度,00 为完全透明、ff 为完全不透明[11]。16 位方案下只能写出 4096 种颜色,精度低于 6 位方案[10]。
字符编码领域同样以十六进制标注码位。Unicode 中的字符采用 U+ 前缀加 4 位或更多十六进制数字的方式书写,例如字母 T 表示为 U+0054[3]。在 C 等语言的源代码中,\u 后需跟 4 位十六进制数字、\U 后需跟 8 位,用于表示通用字符名[4]。此外,编程语言的数值字面量、哈希值与校验和、网络协议字段与数据转储工具,也普遍以十六进制呈现二进制数据[3]。
局限
十六进制并非面向人的计数方式。十进制中 10 至 15 没有传统数码可用,只能借用字母,多数欧洲语言也缺少 10 以上数值的非十进制读法,这使纯十六进制数值不便于口头表达和日常使用[8]。同时,由于书写约定不统一,0x、H 后缀、$ 前缀等写法并存,同一份文档中也可能混用多种标记;脱离上下文时,一串数字究竟是十进制还是十六进制容易引起混淆[4]。
在小数表示方面,16 是 2 的 4 次方而非 10 的倍数,因此凡最简分母不是 2 的幂的分数,在十六进制下都会成为循环小数,其循环现象比十进制更常见,例如 1 除以 9 写作 0.1C7[2]。
在一部分早期浮点运算设计中,以 16 为基数的表示会造成有效位利用率下降:规格化时尾数可能左移 0 至 3 位,为达到与二进制相当的表示误差,需要额外增加至多 3 位尾数[12]。这也是后来多数通用浮点格式改用二进制基数的原因之一。
参见
参考资料
- 图文详情——科普中国资源服务 [引用日期2026-10-29]
- 十六进制 [引用日期2026-10-29]
- 十六进制的定义 [引用日期2026-10-29]
- [科普中国]-十六进制 [引用日期2026-10-29]
- 15-122: Principles of Imperative Computation [引用日期2026-10-29]
- 第1章 chapter 7 [引用日期2026-10-29]
- 西安电子科技大学 [引用日期2026-10-29]
- Hexadecimal [引用日期2026-10-29]
- 为什么使用十六进制值而不是正常的十进制数? [引用日期2026-10-29]
- w3.org 上的网页 [引用日期2026-10-29]
- hex-color [引用日期2026-10-29]
- arith(PDF) [引用日期2026-10-29]