任意数制进制转换器

支持二进制 (Base 2)、八进制 (Base 8)、十进制 (Base 10)、十六进制 (Base 16) 及 2–36 任意自定义进制的高精度双向互转,内置有符号数补码运算与物理寄存器字长建模。

模式与字长
常用预设:
十进制 (Base 10)通用标准
有效字符: 0–93 个字符
十六进制 (Base 16)0x
有效字符: 0–9, A–F1 字节
二进制 (Base 2)0b
有效字符: 0, 18 位 (bits)
八进制 (Base 8)0o
有效字符: 0–73 位数
自定义进制
基数:
字符集: 0–9, a–z (范围 2–36)2 个字符

核心控制选项与参数参考

数制基数选择 (Radix)直接在二进制、八进制、十进制、十六进制间输入,或自由设定 2 至 36 之间的任意自定义基数。
寄存器字长约束 (Word-Length)支持限制物理架构尺寸(8 位 Byte、16 位 Short、32 位 Int、64 位 Long)或无边界 BigInt 任意精度模式。
有符号数补码 (Two's Comp)开启有符号数模式,以标准 CPU 算术取反加一和模运算回绕方式精准模拟负数运算。
代码语法排版 (Formatting)灵活展示编程语法前缀(0b、0o、0x)、半字节/单字节空格分组以及十六进制字母大写。

数制对照速查表与位分块心算法

在软件工程与逆向工程中,二进制、八进制、十进制与十六进制之间的转换往往不需要耗时的除法运算。由于 8(2³)和 16(2⁴)恰好是 2 的整数次幂,二进制位流能够直接一对一映射为单个离散数制字符:

十进制 (Dec)4位二进制 (半字节 Nibble)十六进制 (Hex)3位二进制 (3-Bit)八进制 (Oct)
0000000000
1000110011
2001020102
3001130113
4010041004
5010151015
6011061106
7011171117
810008——
910019——
101010A——
111011B——
121100C——
131101D——
141110E——
151111F——
二进制与十六进制:4位半字节分块心算

从右至左将二进制位按 4 位一组划分。每一个半字节(Nibble)直接无损转译为对应的单个十六进制字符:

二进制:  1101 0110
半字节: 1101 (D)  0110 (6)
十六进制: 0xD6(无符号值 214,8位有符号补码为 -42)
十六进制与八进制:二进制中转桥接

无需通过十进制进行乘除运算,直接将十六进制字符展开为二进制位流,再按 3 位一组重新分块即可完成转换:

十六进制: 0x5B
二进制展开: 0101 1011(8 位)
3位重新切分: 001 011 011
八进制:    0o133(1×64 + 3×8 + 3 = 91)

补码调试深度解析:高半字节符号法则

CPU 底层不存储独立的负号(-),负数采用补码(Two's Complement)进行物理编码。在补码体系中,最高有效位(MSB)被赋予负权值,这使得 CPU 的加法器能够直接处理减法操作:A - B = A + (~B + 1)。

高半字节法则(瞬时符号判定)

在任何固定宽度的 Hex Dump 或变量内存调试中,只需审视最前端的第一个十六进制字符:

  • 8, 9, A, B, C, D, E, F:最高比特为 1 → 有符号模式下必为 负数。
  • 0, 1, 2, 3, 4, 5, 6, 7:最高比特为 0 → 必为 非负数(0 或正数)。
0xFF = -1(8位)  |  0x7F = +127(8位)
类型转换中的符号扩展(Sign Extension)

当拓宽有符号整数(如 int8_t → int32_t)时,CPU 会将最高位复制并填满新增的高位,以确保负数数学真实值不变:

8位:  0xD6(-42)
16位: 0xFFD6(-42,高字节完成符号位复制扩展)
32位: 0xFFFF FFD6(-42,高 24 位全量符号扩展)
十进制数值8位二进制8位十六进制16位十六进制32位十六进制底层硬件解释
+127 (Int8 最大正值)0111 11110x7F0x007F0x0000 007F8位有符号数最高正数边界
+10000 00010x010x00010x0000 0001单位正增量
00000 00000x000x00000x0000 0000唯一零表示(补码无正负零二义性)
-11111 11110xFF0xFFFF0xFFFF FFFF全位激活(所有比特位均为 1)
-421101 01100xD60xFFD60xFFFF FFD6按位取反加 1 (~42 + 1)
-128 (Int8 最小负值)1000 00000x800xFF800xFFFF FF808位有符号数最低负数边界

物理寄存器字长边界与溢出回绕机制

在真实的计算机体系结构中,CPU 寄存器与内存寻址以固定的字长运行。当运算结果超出寄存器所能表达的最大上限时,高位会被自动截断(以 2ᵟ 进行模运算),产生回绕现象。下表为生产级数据类型边界参考:

寄存器字长无符号数值范围 [0, 2ᴺ - 1]有符号数值范围 [-2ᴺ⁻¹, 2ᴺ⁻¹ - 1]最大十六进制值对应编程语言类型 (Rust / C / Go)
8位 (Byte)0 至 255-128 至 +1270xFFu8 / i8, uint8_t / int8_t, byte
16位 (Word)0 至 65,535-32,768 至 +32,7670xFFFFu16 / i16, uint16_t / int16_t
32位 (DWord)0 至 4,294,967,295-2,147,483,648 至 +2,147,483,6470xFFFF FFFFu32 / i32, uint32_t / int32_t
64位 (QWord)0 至 18,446,744,073,709,551,615-9,223,372,036,854,775,808 至 +9,223,372,036,854,775,8070xFFFF FFFF FFFF FFFFu64 / i64, uint64_t / int64_t
自动 (BigInt)0 至 ∞(受可用物理内存限制)-∞ 至 +∞(受可用物理内存限制)动态位宽BigInt (JS), int (Python 3), big.Int (Go)
工程中的整数溢出回绕案例

当对 32 位有符号正数最大值(0x7FFF FFFF / +2,147,483,647)执行 +1 运算时,二进制数值递增为 0x8000 0000。由于最高符号位变为 1,数值在硬件层将瞬间回绕至有符号数的最低负边界:-2,147,483,648。在本工具中选择对应的固定位宽,即可精准模拟这种硬件级别的寄存器截断行为。

Base 36 在真实生产系统中的应用:URL 短链与分布式主键压缩

二进制与十六进制广泛应用于底层内存排查,而在面向网络传输与高密度存储时,高基数数制能够大幅削减字符占用:

Base 36(字母数字 0–9, A–Z)

利用 10 个阿拉伯数字与 26 个英文字母,不区分大小写。由于生成的字符串绝对不包含 URL 保留字符(无需任何 %2B、%2F 百分号转义),常用于将高并发数据库自增 ID 压缩为优雅的短链接或帖子唯一标识(如 Reddit 评论 ID)。

342,551,797 → 5NY2NP(仅占 6 个字符)
Base 32(RFC 4648 规范)

采用 32 个特定字符(A–Z, 2–7),严格剔除极易造成视觉混淆的字符(0/O, 1/I/L, 8/B)。专为人工手动抄写与键盘录入场景设计,如 Google Authenticator 双因子认证(2FA)密钥以及 Tor .onion 隐匿地址。

JBSWY3DPEHPK3PXP(TOTP 认证种子)
Base 64(二进制字节流传输)

与代表纯数字整数的 Base 36 不同,Base 64 属于字节级序列化协议。每字符承载 6 位二进制信息,用于将任意不可打印的二进制文件、加密密钥或媒体数据安全打包至 7 位 ASCII 文本信道(如 HTTP 请求头、JSON 载荷、MIME 邮件)中传输。

data:image/png;base64,iVBORw...

主流编程语言数值字面量与位掩码语法速查

编译器默认将无前缀的纯数字解析为十进制。在不同语言中声明二进制、八进制或十六进制常量时,需遵循标准的前缀语法:

编程语言二进制前缀八进制前缀十六进制前缀数字可读性分隔符
JavaScript / TypeScript0b / 0B0o / 0O0x / 0X下划线: 0xFF_FF
Python 30b / 0B0o / 0O0x / 0X下划线: 0b1111_0000
Rust0b0o0x下划线: 0xDEAD_BEEF
Go (Golang)0b / 0B0o / 0O0x / 0X下划线: 0_644
C / C++0b / 0B (C++14 / C23)0 (传统) / 0o (C23)0x / 0X单引号 (C++): 0xFF'FF
生产级位操作(Bitmask)核心范式
置位第 n 位 (Set Bit)flags |= (1 << n)
清除第 n 位 (Clear Bit)flags &= ~(1 << n)
翻转第 n 位 (Toggle Bit)flags ^= (1 << n)
检测第 n 位 (Test Bit)(flags & (1 << n)) != 0

主流语言生产级进制转换代码示例

在后端与系统服务中,解析及格式化 2 至 36 任意数制整数的标准实践:

TypeScript & JavaScript(BigInt 与 2–36 任意基数)
// BigInt 可无损转换为 2 至 36 之间的任意数制字符串
const val = 3735928559n;
const hex = val.toString(16); // "deadbeef"
const b36 = val.toString(36); // "1ps9wxb"

// 将不同进制字符串解析为大整数
const parsedHex = BigInt('0x' + hex); // 3735928559n

// 模拟 8 位补码有符号数回绕
const signed8 = BigInt.asIntN(8, -42n);   // -42n
const unsigned8 = BigInt.asUintN(8, -42n); // 214n (0xD6)
Python 3(内置进制函数与动态解析)
# 将整数格式化为二进制、八进制与十六进制
num = 3735928559
bin_str = bin(num)  # '0b11011110101011011011111011101111'
hex_str = hex(num)  # '0xdeadbeef'

# 解析 2 至 36 任意基数的字符串
val_from_hex = int("DEADBEEF", 16)  # 3735928559
val_from_b36 = int("1ps9wxb", 36)   # 3735928559
Go (strconv 标准库高并发解析)
package main

import (
    "fmt"
    "strconv"
)

func main() {
    val := int64(3735928559)

    // FormatInt 原生支持 2 至 36 之间的任意数制
    hexStr := strconv.FormatInt(val, 16) // "deadbeef"
    b36Str := strconv.FormatInt(val, 36) // "1ps9wxb"

    // 显式指定基数进行安全解析
    parsed, _ := strconv.ParseInt(hexStr, 16, 64)
    fmt.Println(parsed) // 3735928559
}
Rust (std::fmt & from_str_radix 零成本抽象)
fn main() {
    let val: u32 = 0xDEAD_BEEF;

    // 格式化输出
    let bin_str = format!("{:b}", val);
    let hex_str = format!("{:X}", val); // "DEADBEEF"

    // 解析 2 至 36 任意基数字符串
    let parsed = u32::from_str_radix("DEADBEEF", 16).expect("valid hex");
    assert_eq!(val, parsed);
}

Frequently Asked Questions

为什么在计算机中 -1 的十六进制显示为 0xFF 或 0xFFFFFFFF,而不是带有负号的形式?

计算机底层硬件与处理器寄存器并不存储独立的“-”负号字符,而是采用“二进制补码(Two's Complement)”体系来存储带符号数值。在补码机制下,-1 的数学表达方式是将整数字长内的所有二进制位全量置 1(所有比特位激活)。在 8 位寄存器中,全 1 即为 1111 1111,对应十六进制 0xFF;在 32 位寄存器中,32 个连续的 1 则表现为 0xFFFF FFFF。当在本工具中开启“有符号数 (补码)”模式时,解析器会将最高有效位(MSB)作为负权权重进行加权运算,从而在 8 位模式下准确将 0xFF 还原为 -1。

在工程排查十六进制 Dump 内存转储时,如何一眼判定某个数是否为负数?

直接观察最高有效位(即最左侧)的十六进制字符。因为每一个十六进制字符严格对应 4 个二进制比特(8、4、2、1),字符 8 至 F 的最高二进制位必为 1(8 = 1000₂,9 = 1001₂,A = 1010₂,...,F = 1111₂)。在定长有符号补码体系中,最高有效位为 1 即代表负数。若首字符在 0 至 7 之间(最高比特位为 0),则该数值必为非负整数(0 或正数)。

算术右移(>>)与逻辑右移(>>>)在底层位运算中有何本质区别?

两者的核心差异在于如何处理最高位符号位。算术右移(>>)会保留符号位(符号扩展 Sign Extension):若原始数值为负(最高位为 1),移位后左侧空出的高位统一用 1 填充;逻辑右移(>>>,亦称无符号右移)则不考虑符号语义,无条件从左侧补 0,从而将原本的有符号负数转换为极大的无符号正整数。例如在 32 位整型中:(-42 >> 1) 运算结果保持为 -21,而 (-42 >>> 1) 则会计算为 2,147,483,627。

原生 JavaScript 为什么在超过 53 位整数后会出现精度丢失,BigInt 是如何解决的?

JavaScript 原生 Number 类型遵循 IEEE-754 双精度浮点数标准,仅为尾数(有效数字)分配了 53 个二进制位(含 1 个隐式首位),其余 11 位用于指数,1 位用于符号。当数值超出 Number.MAX_SAFE_INTEGER(即 9,007,199,254,740,991,2⁵³ - 1)时,浮点格式无法表达连续的整数粒度,导致最低有效位发生舍入塌陷。BigInt 机制则彻底绕过硬件浮点单元,在内存堆中动态分配 64 位机器字(Limb)数组来表示任意大小的整数,从而保障 64 位、128 位乃至 256 位加密散列与大整数运算的零精度损失。

为什么 UNIX 文件权限(如 chmod 755)天然契合八进制(Octal)表示?

UNIX 文件系统的安全权限模型将访问权限划分为三种正交标志位——读(Read,4,2²)、写(Write,2,2¹)和执行(Execute,1,2⁰),并按属主(Owner/User)、属组(Group)和其他人(Other)三层实体分别控制。由于 2³ = 8,每 3 个权限二进制位正好唯一对应一个 0(---)至 7(rwx)的八进制数字。例如权限字符串 rwxr-xr-x 直接切分为 [111](7)、[101](5)、[101](5),无需进行复杂的基数转换即可直观表达。

将 8 位有符号整数强制类型转换(Cast)为 32 位整型时,符号扩展是如何运作的?

当窄位宽有符号整型拓宽至宽位宽寄存器时,CPU 必须保持其原有的数学真实值。若 8 位数值为 -42(二进制 1101 0110,十六进制 0xD6),如果单纯在高位填 0(零扩展 Zero Extension),数值就会错误变成 0x0000 00D6(+214)。符号扩展(Sign Extension)机制会将 8 位原始数据的最高有效位(1)无条件复制并填满新增的高 24 位,生成 0xFFFF FFD6,其在 32 位补码体系下精确保持为 -42。

在现代分布式数据库主键与短链接设计中,为什么 Base 36 常优于 Base 64?

Base 36 仅采用 0–9 数字与 A–Z 英文拉丁字母共 36 个字符,且具有天然的大小写不敏感特性。这彻底杜绝了人工转录、口述时的易混淆问题,并且在 Web URL 中使用时绝不会引入需要百分号转义的保留符号(如 +、/、=)。虽然 Base 64 压缩率略高,但其大小写敏感(需严格区分大小写字母)并在标准规范中含有 + 与 /,在大小写不敏感的文件系统、某些数据库排序规则或 URL 路径中容易引发解析冲突或需要额外的 URL 安全转义(RFC 4648 Base64URL)。

底层位掩码(Bitmask)操作中,为什么常用 0x0F 和 0xFF 这类十六进制常量?

由于 1 个十六进制字符精准对应 4 个二进制位(1 个半字节 Nibble),2 个十六进制字符对应 1 个完整的 8 位字节(Byte),十六进制成为了位操作最直观的视觉模板。常量 0x0F(二进制 0000 1111)能屏蔽高 4 位并完整保留低半字节;而常量 0xFF(二进制 1111 1111)常用于从 32 位或 64 位整数中提取指定字节,例如在图形图像处理中提取 RGB 颜色分量:(color >> 16) & 0xFF 即可精确抽取红色通道分量(Red Byte)。