跳到主内容
UniKit

有符号数表示转换

二进制 / 十进制 / 十六进制之间的原码、反码、补码互转:位宽可选 4 / 8 / 16 / 32 / 64,支持负数、负零与溢出检测,并显示二进制分组与各表示的取值范围(如 8 位补码 -128…127)。

浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。

编码方式
-5
二进制位模式1111 1011
十六进制0xFB
无符号解读251

各种表示对照

同一个位模式在不同表示下含义不同,所以下表按表示分别列出;无符号一行是把当前位模式直接按无符号读。

原码1000 01010x85= -5
反码1111 10100xFA= -5
补码1111 10110xFB= -5
无符号1111 10110xFB= 251

该位宽的取值范围

原码-127 … 127
反码-127 … 127
补码-128 … 127
无符号0 … 255

这个工具能做什么

  • 做嵌入式或底层调试时把 -5 换算成 8 位补码 11111011,不用手算取反加一。
  • 反方向使用:从示波器、内存 dump 或协议文档里拿到一串位模式,确认它按补码、反码、原码分别读出来是多少。
  • 交作业或讲课时把同一组位的四种解读列成表格,顺便标出原码/反码的负零和取值范围。
  • 检查溢出:8 位补码只能表示 -128…127,输入 200 会直接提示超出范围,而不是悄悄截断。

示例

输入

数值模式,位宽 8 位,编码方式补码,输入 -5

输出

位模式 11111011(分组 1111 1011),十六进制 FB,无符号解读 251
原码 10000101(85)、反码 11111010(FA)、补码 11111011(FB)

十进制输入时按所选编码生成位模式;同一组位在四种表示下含义不同,所以对照表逐行列出,无符号那一行是把当前位模式直接当无符号数读。

常见问题

原码、反码、补码到底差在哪?

原码最高位是符号位、其余是绝对值(-5 → 10000101);反码把负数的绝对值按位取反(-5 → 11111010);补码是反码加一(-5 → 11111011),也是 CPU 里实际使用的表示,好处是减法可以复用加法电路、并且没有 -0。

为什么原码和反码的 8 位范围是 -127…127,补码是 -128…127?

因为原码和反码里 10000000 / 11111111 表示「负零」,白白浪费了一个编码,所以最小值只能到 -127。补码里没有负零,10000000 直接用来表示 -128。

输入位数不够或太多会怎样?

位数不足会在左边自动补 0,例如 8 位下输入 101 变成 00000101;超过位宽(8 位输入 9 个二进制位)会提示「位数超过位宽」并拒绝计算,不会静默截断。

64 位大数会丢精度吗?

不会。整个换算过程用 BigInt,不经过 Number,所以 64 位补码 -9223372036854775808 这种值也能精确表示。相反,用 JavaScript 的位运算(>>、&)处理 32 位以上会出错。

十六进制输入支持哪些写法?

可以带 0x 前缀也可以不带,大小写都认,中间的空格与下划线会被忽略,例如 FB、0xff、FF、f f 都等价。二进制同样支持 0b 前缀和空格分组(1111 1011)。

关键词:binarybitstwos complementones complementsign magnitude补码反码原码有符号位运算溢出

同类工具