跳到主要内容
CalcMax

十六进制计算器

结果

2A5A

十六进制

十进制
10,842
二进制
10101001011010
余数
0

十六进制计算器把两个十六进制数做加减乘除,答案同时用十六进制、十进制与二进制三种写法给出。十六进制是逢十六进一,所以需要十六个数字符号,而熟悉的数字只有十个——缺的六个从字母表里借,用 A 到 F 表示十到十五。这就是这套记法的全部:A 不是编码也不是缩写,它就是排在 9 后面的那个数字。运算与十进制笔算一样,只是进位线从九挪到了 F,某一位加过 F 就往上进一。同一个答案写三种读法,是因为三种读法服务不同的人:十六进制是这个值平时被写成的样子,十进制是最容易一眼复核的,而二进制是底下的那些位——十六进制的每一个数字本来就是从那里切出来的。除法是整除,除不尽时余数单独占一行,不会化成小数点后面的数字。

公式

2A3F + 1B = 2A5A (10815 + 27 = 10842)

2A3F
第一个数,用十六进制写。字母也是数字:A 是十、B 是十一,一直到 F 是十五。把 A 当成别的东西,正是本页要防的那个错
+ − × ÷
运算符。与十进制一样逐位进行,只是底的十六代替了十,某一位满十六才向上进一
F + 1 = 10
这个进制下的进位规则:十五加一这一位就写不下了,要新起一位。它与十进制的 9 + 1 = 10 是同一件事,只是发生在再往后的一个数字上
各位数字 × 16ⁿ
十进制读数是怎么来的:每一位乘上它的位值再相加。2A3F 就是这样得出 10815 的——8192 加 2560 加 48 加 15
一位四位
这个进制为什么会存在。一个十六进制位正好装四个二进制位,所以一个字节正好是两位,两种写法之间的转换不需要任何计算,只是重新分组
余数
除不尽时剩下的部分。这一行恒在,另外三种运算不会有余数,所以读作 0——那个 0 是「这次运算没有剩下东西」,不是没算出来
53 位
本页接受的输入上限:最大 9007199254740991,写成十六进制是 1FFFFFFFFFFFFF,也就是十四位。再宽的话机器没法把相邻的整数区分开,运算会悄悄地不再精确

十六进制是二进制在人要读的时候的样子。凡是十六位以上的值——内存地址、颜色、哈希、机器码清单、设备寄存器、网络抓包——都是用它印出来的,而在这些值上做运算是这一层工作每天都要干的事。给指针加一个偏移、算一个结构体的大小、求校验和、调试时按步长走过一段地址、检查某个掩码置上了哪几位,都是在十六进制数上做的运算,而答案旁边的二进制读数正是把这些结果还原成标志位与字段的依据。做前端与设计的人则在颜色值上遇到它:每个通道两位,正好是屏幕要的那个字节。这一页反过来也一样用:手上是十进制、要跟规格书对上或粘进某个工具时,换算成十六进制;二进制读数则回答到底哪几位是 1。学数制的学生同样受益,因为字母看着最像凭空规定,而在位值摊开之后就不像了。

算例

  1. 2A3F 加 1B

    1. 两个数右端对齐:2A3F 与 001B
    2. 最右一位:F + B,也就是 15 + 11 = 26 = 16 + 10,所以本位写 A、进 1
    3. 下一位:3 + 1 再加进上来的 1 得 5,本位写 5
    4. 再下一位:A + 0 = A,本位写 A
    5. 最高一位:2 + 0 = 2,本位写 2
    6. 结果读作 2A5A,也就是十进制的 10842

    默认算例,也是唯一一次进位跨过字母的边界:F 加 B 是二十六,也就是一个十六再加十,所以写下来的数字是 A 而不是一个两位的数。旁边的二进制读数是同样这些位按四位一组重新切出来的,可以顺手复核整件事。

  2. 2A3F 除以 1B

    1. 这是 10815 除以 27
    2. 27 进 10815 正好四百次,剩下 15
    3. 四百写成十六进制是 190,余数十五写成 F
    4. 页面报出 190,并单列余数 F

    这里的余数是 F,也就是十五——一个比除数小、却仍然要用字母写的值。也正是这一条说明那行恒在的余数值得占位置:没有它答案会读成 190,而 400 乘 27 是 10800,不是 10815。

  3. 同一道题,全小写输入

    1. 小写字母与大写字母是同一个数字:a 是十,与 A 完全一样
    2. 运算没有任何区别,所以答案还是 2A5A
    3. 页面一律用大写印出结果,与输入时怎么打无关

    值得知道,是因为两种写法日常都在用——CSS 的颜色值几乎全小写,而反汇编与数据手册全大写——两种都不算错。只有印出来的答案会被统一,而且统一到大写这一边。

局限

本页只处理整数。没有十六进制小数点,也不收小数形式的输入,所以 2A.8 会被拒绝;除不尽时给出的是截断过的商加上余数,而不是小数答案。输入上限是 1FFFFFFFFFFFFF,也就是 9007199254740991——这个宽度是机器没法再区分相邻整数的位置——结果同样受这条线约束,越界时报错而不是给一个近似值。负的结果写成前面带负号,而不是补码,也不假定任何固定位宽:本页的 1B 就是两位,不是某个字节的低位。小写会被接受,答案一律大写印出。除以零会被拒绝。本页做的是三种进制下的运算与换算,不做位运算,没有与、或、异或,也没有移位。

常见问题

那些字母是什么意思?
它们是数字。十六进制需要十六个不同的数字符号,而熟悉的数字只有十个,所以用 A 到 F 表示十到十五——A 是十,F 是十五。选这些字母不含任何编码的意思,它们只是字母表里接下来的几个字符,换成另外十六个互不相同的符号也照样成立。大小写在这里表示同一个数字。
为什么这里 1 加 1 不像二进制那样进位?
因为底不同,一位能装下的量就不同。二进制里没有表示二的数字,所以两个 1 立刻进位;十六进制里一直到十五都还有数字可写,所以只有某一位加过 F 才会往上进。二加二在哪个进制里都是四,变的只是记数的符号。
输入的大小写有影响吗?
没有。2a3f 与 2A3F 是同一个数,两种都会被接受,因为字母在这里是数字,而数字不分大小写。答案一律用大写印出。两种写法日常都在用——CSS 的颜色值通常写小写,反汇编与数据手册写大写——所以两种都收不花任何代价,而拒收其中一种只是无谓的规定。
最大能输入多少?
1FFFFFFFFFFFFF,也就是十四位十六进制数,换成十进制是 9007199254740991,换成二进制是一后面五十三个 1。超过这个宽度,机器就没法区分相邻的整数,运算会悄悄地不再精确——结果看起来像个数,其实不是。更宽的输入会被拒绝而不是被截断,计算出来的结果越过同一条线时也一样会被拒绝。
这一页和进制换算器是一回事吗?
它是换算器的运算那一半。这一页收两个数和一个运算符;把单个值在不同进制之间换算的是另外几页,本页下方有链接。把四件事合并成输入进制与输出进制都让用户选的一页,是评估过又否决的设计,它会丢掉一件重要的能力:判断你打进去的东西的形状——一个接受任意进制的输入框没法告诉你 2G 在你选的那个进制里根本不是数。
为什么结果里总有一行余数?
因为结果面板是一组固定的行,不随运算改变形状,而一个时有时无的行比一个位置固定的行更难读。整数范围里加减乘都不会有余数,所以那几行读作 0,而那个 0 是实话,不是占位符。真正会留下余数的是除法,那一行存在的意义是不让一个截断过的商看起来像一个精确答案。

参考资料

相关计算器