调试寄存器、看内存地址、算颜色值、做权限位掩码……总要在几种进制之间来回倒。在任意一个输入框里敲数字,另外四种进制实时同步,采用 BigInt 精确计算,再大的整数也不丢精度。
计算机里只存 0 和 1,没地方写字正负号,于是约定:定长(8 / 16 / 32 / 64 位)二进制的最高位当符号位——0 是正、1 是负。为了把「符号 + 数值」塞进同一串 0/1,就出现了三套规则。
| 表示法 | 正数 +5(8 位) | 负数 −5(8 位) | 规则(8 位) |
|---|---|---|---|
| 原码 | 0000 0101 | 1000 0101 | 符号位:正数 0、负数 1;其余 7 位照抄 |x| 的二进制 |
| 反码 | 0000 0101 | 1111 1010 | 正数照抄原码;负数符号位保持 1,其余 7 位逐位 0↔1 |
| 补码 | 0000 0101 | 1111 1011 | 正数照抄原码;负数 = 反码 + 1(也等于 28 − 5 = 251) |
三码的关系:补码 = 反码 + 1;反码 = 原码除符号位外逐位取反;正数的原码 / 反码 / 补码完全相同,只有负数才有区别。
为什么最后统一用补码:原码里 0000 0000 表示 +0,1000 0000 表示 −0——同一个 0 有两种写法;反码也一样。而且做减法得先比大小、再定符号,电路很麻烦。补码把 −0 这个图案让给了 −128,0 只剩一种写法;减法也变成「加一个负数」:a − b = a + (−b),CPU 只留一套加法器。
范围怎么来的:8 位一共 28 = 256 个图案。补码把这些图案平分成两半:0 ~ 127 给正数与 0,−128 ~ −1 给负数,所以 8 位有符号的范围是 −128 ~ 127;不考虑符号则是 0 ~ 255。最大值再加 1 会翻到最小值,例如 0x7F + 1 = 0x80(127 + 1 = −128)。
下面的表格会用你输入的数值和当前位宽,逐步算出原码 → 反码 → 补码。
二进制、八进制、十进制、十六进制只是同一个数字的四种写法。计算机底层全是二进制,而十六进制每 1 位恰好对应 4 位二进制,转换不用心算,所以内存地址、颜色值、字节序列、协议字段几乎都用十六进制书写;八进制现在主要出现在 chmod 755 这类文件权限里。
开发中常见场景:把 IPv4 地址转成 32 位整数存进数据库(192.168.1.1 → 3232235777),用位掩码做权限组合(1 | 2 | 4),调试硬件寄存器与协议报文,分析 #FF5733 这类颜色分量,读 0x7FFFFFFF 判断 signed / unsigned 边界。
这些换算本身不难,但手算容易出错,尤其是位数一多。本工具让四种进制互为镜像实时联动:改动任意一个,其余三个立即跟上;输入了非法字符(比如二进制里出现 2)会立刻指出问题,而不是静默给你一个错值。
实现上采用 JavaScript 的 BigInt 而不是 Number:Number 只有 53 位安全整数精度,超过就会变成 1.2345678901234568e+21 这种失真的科学计数法;BigInt 是任意精度整数,64 位、128 位甚至几百位的数值都能精确展开。所有计算在你的浏览器里完成,没有任何数据上传。
0x 可写可不写,工具会自动识别并去掉,输入 0xFF 与 FF 等价。1111 = F。记住这一点,手工粗算时会快很多。0x7FFFFFFF(2147483647),加一就溢出成负数。#RRGGBB 每个分量是 0–255,拆开填进十进制框就能看清各通道强度。-x 的补码等于 2n - x。8 位下 -1 的补码就是 0xFF;-128(0x80)是补码独有值,没有原码和反码。Number 是 IEEE 754 双精度浮点,只能安全表示 53 位整数(约 9×1015)。超过这个范围,末位就开始被四舍五入,例如 9007199254740993 会变成 9007199254740992。本工具使用 BigInt,任意精度、逐位精确,64 位以上的数值也能完整转换。-255、-0xFF 这类负值,四栏联动显示绝对值,同时在「补码视图」按 8 / 16 / 32 / 64 位给出原码 / 反码 / 补码对照。小数涉及浮点表示与精度问题,不在整数转换的范围内。-1 为例:原码把最高位当符号位,写作 1000 0001;反码保持符号位、其余位取反,得到 1111 1110;补码再加一,得到 1111 1111,即 0xFF。计算机实际存储用的是补码,加减法电路统一、0 的表示唯一。-128(0x80)是补码独有值,没有原码和反码。chmod 755 里的 755 就是八进制,表示 user / group / other 三组的 rwx 位组合。此外 tar 归档格式的头部字段、老式 C 代码里的字面量(0755)也在用八进制。(a << 24) | (b << 16) | (c << 8) | d。例如 192.168.1.1 得到 32 位整数 3232235777,用十六进制看就是 0xC0A80101。这类转换在 IP 段比较、数据库索引优化中很常见,本工具可以直接双向验证。255 的二进制是 11111111,共 8 位、占 1 字节;256 是 100000000,共 9 位、占 2 字节。工具会在结果下方直接给出换算好的位数与字节数,判断需要几个字节存放时很方便。审核通过后就会展示在留言板上,稍安勿躁~
还没有留言,来抢沙发吧!