十进制转十六进制换算器
结果
十六进制
- 各位位值
- 2×4096 + 10×256 + 3×16 + 15
十进制转十六进制换算器把一个整数从十进制改写成十六进制。方法与产生二进制的那套一样,都是不断做除法,只是把二换成十六:用十六除这个数,留下余数,再用十六除商,一直到商为零为止。变的是字母表。除以二只可能余下 0 或 1,除以十六却可以余下 0 到 15 之间的任何值,而十六进制把十到十五这六个值写成字母 A 到 F——A 是 10,B 是 11,一直到 F 是 15。所以余数并不是直接就是十六进制数字:它们是以数值的形式出来的,凡是九以上的余数,都要先换成对应的字母,答案才算写完。以 10815 为例:10815 ÷ 16 得 675 余 15,675 ÷ 16 得 42 余 3,42 ÷ 16 得 2 余 10,2 ÷ 16 得 0 余 2。把余数从下往上读,是 2、10、3、15——换成 2、A、3、F,所以 10815 的十六进制写法是 2A3F。字母正是这一页存在的理由。答案旁边的位值和从另一头展示同一个数:十六进制里各位分别值 4096、256、16 和 1,而 2A3F 是 2×4096 加 10×256 加 3×16 加 15,加回来正好是 10815。十六进制之所以被用,是因为一个十六进制位恰好是四个二进制位,于是一个字节永远是两个字符、一个三十二位的值永远是八个——颜色码、内存地址、哈希都是这么写下来的,原因就在这里。
把 10815 一轮一轮除以十六,直到商变成零
| 轮次 | 除法 | 商 | 余数 |
|---|---|---|---|
| 1 | 10815 ÷ 16 | 675 | 15 (F) |
| 2 | 675 ÷ 16 | 42 | 3 |
| 3 | 42 ÷ 16 | 2 | 10 (A) |
| 4 | 2 ÷ 16 | 0 | 2 |
这张梯子里有四个余数、其中两个写成「数值(字母)」的形式——15 (F) 与 10 (A)——这种双重写法正是这张表存在的理由。算术给你的是 15,答案要的是 F。把除法做对、然后照抄余数那一列的人写出来的是 2103 而不是 2A3F,这是这道换算唯一主动招来的错法。把这一列从下往上读,答案的字符就按顺序出现:2、10、3、15,把两个九以上的值换掉之后就是 2A3F。表固定用 10815,而上面的面板换算你输入的那个数,因为它展示的是方法而不是结果。商每一轮缩到大约十六分之一,所以即使是允许的最大输入,梯子也只有十四行——这正好就是十六进制上界 1FFFFFFFFFFFFF 的位数。
公式
10815 ÷ 16 = 675 余 15 → 675 ÷ 16 = 42 余 3 → 42 ÷ 16 = 2 余 10 → 2 ÷ 16 = 0 余 2 ⇒ 10815 = 2A3F = 2×4096 + 10×256 + 3×16 + 15
- 10815
- 要换算的那个整数,用十进制写。小数点与千分位分隔符都会被拒收而不是被四舍五入掉,所以写 10815,不要写 10,815
- ÷ 16
- 反复执行的那一步,十六取代了二进制版本里那个二。十六是你要换进去的底,所以每一轮问的都是「里面有几个十六」、剩下来多少
- 商
- 带进下一轮的那部分。商变成零就是停止的信号,它表示答案里再往左的位都不需要了
- 余数
- 这一轮产生的数字位,而这里它可以是 0 到 15 之间的任何值,不再只可能是 0 或 1。抹掉这个差别就是这道换算最常见的错法:余数 15 不是数字位 15,因为十六进制里根本没有能写它的单个字符
- A — F
- 代表十到十五这六个值的字母:A 是 10、B 是 11、C 是 12、D 是 13、E 是 14、F 是 15。它们不是另一套要背的记法,每一个只是那个写不成单个十进制字符的数值
- ⇒ 2A3F
- 把各位从下往上拼起来的结果,而九以上的余数这时已经换成了字母。最先求出的余数是答案最右边的那个字符,所以按写下的先后顺序读出来的是反过来的答案
- 2×4096 + 10×256 + 3×16 + 15
- 把答案按位值读回来。与二进制不同,这里的系数不全是 1——正是这道核对能抓住字母换错的情况,因为 A 换错一个数,和就对不上
十六进制是工程上读的那种写法,所以凡是一个值要在两种写法之间搬动,就会用到这道换算。颜色码是最日常的一例:一个 0 到 255 的通道正好是两个十六进制字符,所以一个颜色写成六个字符,也所以设计师说的 10815 和开发者写的 2A3F 是同一个颜色。内存地址、校验和、哈希、数据手册里的寄存器值也都用十六进制印,理由一样——一个字符四个位,一个值的宽度一眼就能读出来。看调用栈或抓包的人每小时要把反方向做过几十遍,而写掩码或魔数的人做的是这个方向。课程里这道题往往是直接问的,一般写作把十进制转成十六进制并写出过程,下面那张梯子就是那个过程:一行一次除法,字母已经换好。它同时也是让宽度变明显的一步,因为两个字符是一个字节、八个是一个三十二位字,所以这道换算还回答了「这个值在目标格式里占几个字符」。
算例
把 10815 写成十六进制
- 10815 ÷ 16 = 675,余 15——写下 15,它写作 F
- 675 ÷ 16 = 42,余 3
- 42 ÷ 16 = 2,余 10——它写作 A
- 2 ÷ 16 = 0,余 2——商已经是零,到此为止
- 把余数从下往上读:2、10、3、15
- 把 10 换成 A、15 换成 F:答案是 2A3F
默认值,也是两个替换都要做的一条。注意四个余数里有两个需要换字母,这不是运气不好而是常态:十六次里大约有六次会余出九以上的值,而一个三四位长的答案通常至少含一个。
一个字节写满,255
- 255 ÷ 16 = 15,余 15——写成 F
- 15 ÷ 16 = 0,余 15——也写成 F
- 商已经是零,把两个余数从下往上读:FF
一个字节能装的最大值只占两个字符,十六进制存在的理由正在这里。FF 与 255 这一对值得直接记住:它是颜色通道的上限、多数语言里无符号字节的上限,也是一个字符原始数据的量。
一个十六的幂,1048576
- 1048576 ÷ 16 = 65536,余 0
- 65536 ÷ 16 = 4096,余 0
- 4096 ÷ 16 = 256,余 0
- 256 ÷ 16 = 16,余 0
- 16 ÷ 16 = 1,余 0
- 1 ÷ 16 = 0,余 1——从下往上读,得到 100000
这是二进制那一页「2 的幂」例子在十六进制里的回声:底的幂写成一位 1 后面跟一串 0。1048576 是 16⁵,也是 2²⁰,而这正是这套记法的意义——同一个值在二进制里是二十一位,在十六进制里是六位,后者读得出来。
一个负数
- 负号是带着走的,不参与换算:数字位按第一条例子对 10815 求
- 10815 ÷ 16 = 675 余 15,一路到 0 余 2
- 从下往上读出的数字位是 2、A、3、F
- 把符号加在最前面:-2A3F
前导负号会被收下、并印在最前面,位值和则整个括起来,让负号作用于整串加法而不是它的第一项。注意这不是什么:它是一个带符号的量值写法,不是机器里存的那个补码位模式。要的是负数的寄存器内容而不是它的带符号写法,那是另一个问题、另一页。
局限
这一页只换算整数,所以小数点会被拒收而不是被四舍五入——10815.5 在这里换不了。千分位分隔符也不收:写 10815,不要写 10,815,因为逗号在有些语言里是小数点,在两读之间猜一个不如直接要求写清楚。输入的上界是 9007199254740991,也就是十四位十六进制,它的十六进制写法是 1FFFFFFFFFFFFF——与二进制那几页的五十三位是同一个上界,因为它是同一个界的两种写法。前导零与前导负号都收;负号给出的是量值的带符号写法,不是补码位模式。下面那张表印的是 10815 的除法梯子,不跟着你输入的数变。反过来的方向,也就是把十六进制读回十进制,是另一页的事,这一页不对结果做任何运算。
常见问题
- 怎么手算十进制转十六进制?
- 用十六除,写下余数,再用十六除商,重复到商为零。把余数从下往上读,并把所有九以上的余数换成字母:10 是 A、11 是 B、12 是 C、13 是 D、14 是 E、15 是 F。10815 从上到下的余数是 15、3、10、2,往上读并替换之后就是 2A3F。
- 十六进制里为什么要用字母?
- 因为十六进制要十六个单字符,而十进制数字只提供十个。多出来的六个符号总要有个来源,字母是所有系统都同意的那套约定。A 是十、F 是十五,所以这套记法的数字位从 0 排到 9,再从 A 排到 F。这不是换算之外额外要背的东西——一个字母永远只是某个塞不进单个十进制字符的余数的名字。输入不分大小写,而答案里的字母一律写成大写字母,这是技术写作里通行的约定。
- 这一页最大能换算多大的十进制数?
- 9007199254740991,写成十六进制是 1FFFFFFFFFFFFF——十四个字符。这个上限与二进制那几页的五十三位来自同一个地方,因为它是同一个数在两种底下的写法。更大的会被带着说明拒收,而不是照换不误:超过这个宽度,机器已经分不开相邻的两个整数,换出来的答案不可信。
- 十六进制是不是就是二进制写短一点?
- 它是同一个值写在「底是 2 的幂」的进制里,所以两者之间才这么好转。一个十六进制字符恰好是四个二进制位,因此 2A3F 就是 0010 1010 0011 1111,一点不剩。这不是这个例子的巧合:它对任何十六进制数都成立,而十六进制之所以被用,正是因为这一点。转换过程中什么都没丢,也不需要任何舍入。
- 带小数的十进制数能换算吗?
- 这一页不行。它只收整数,所以 10815.5 会被拒收而不是被四舍五入。十六进制里的小数是完全定义好的——小数点右边那些位分别值十六分之一、二百五十六分之一——但收下它们就得决定保留几个字符、最后一位怎么舍入,而这一族的每一页都只换算整数。
- 为什么除了十六进制数还要印一个位值和?
- 因为它是能抓住替换错误的那道核对。要是你把余数 15 换成了别的字母,或者该写 F 的地方写了 A,印出来的和就加不回你输入的那个数——只有当字母读对了,2×4096 + 10×256 + 3×16 + 15 才是 10815。与二进制版本的同名求和不同,这里的系数不全是 1,所以答案的每一个字符都被单独算了账。
参考资料
- Hexadecimal——十六进制、九以上的那些数字,以及它与十进制之间的换算 — Wolfram MathWorld(美国)
- Number base——一个数的值为什么取决于它所在的位置与所用的底,以及同一个量如何写成不同的进制 — Wolfram MathWorld(美国)
- Powers of two——2 的幂序列,十六进制的各位正是每隔四项取一个,OEIS 编号 A000079 — OEIS Foundation Inc.(美国)
- 教育部关于印发义务教育课程方案和课程标准(2022 年版)的通知——该通知的附件清单第 5 项是《义务教育数学课程标准(2022 年版)》;进位制与不同进制之间的换算是该课标数与代数领域的内容,原文与学段要求以该附件为准 — 中华人民共和国教育部