news 2026/4/15 18:42:15

四种有符号数编码方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
四种有符号数编码方式

四种有符号数编码方式

1. 原码 (Sign-Magnitude)

核心思想:最高位表示符号(0正1负),其余位表示绝对值。

  • 正数:符号位0,数值位为真值的二进制绝对值
  • 负数:符号位1,数值位为真值的二进制绝对值

例子(8位表示):

  • +18→ 原码:0001 0010
  • -18→ 原码:1001 0010

特点

  • 直观易懂,符合人类习惯
  • 存在+0和-00000 00001000 0000都表示0
  • 加减运算复杂:需要判断符号位,硬件实现麻烦

2. 反码 (Ones’ Complement)

核心思想:正数的反码等于原码,负数的反码是原码的符号位不变,其余位按位取反。

  • 正数:与原码相同
  • 负数:符号位保持1,数值位全部取反

例子(8位表示):

  • +18→ 原码:0001 0010→ 反码:0001 0010
  • -18→ 原码:1001 0010→ 反码:1110 1101

特点

  • 存在+0和-00000 00001111 1111都表示0
  • 加减法稍微简化,但仍有循环进位问题
  • 补码出现前的过渡方案,现已基本不用

3. 补码 (Two’s Complement) ✅最重要!现代计算机标准

核心思想:正数的补码等于原码,负数的补码等于反码加1。

  • 正数:与原码相同
  • 负数:符号位保持1,数值位取反后加1

例子(8位表示):

  • +18→ 原码:0001 0010→ 补码:0001 0010
  • -18
    原码:1001 0010 取反:1110 1101 (反码) 加1:1110 1110 (补码)

特点

  • 只有一个00000 0000
  • 范围不对称:n位补码范围是-2ⁿ⁻¹+(2ⁿ⁻¹ - 1)
    • 8位:-128 到 +127
  • 加减运算统一:减法可转换为加法,硬件实现简单
  • 现代计算机几乎全部使用补码

快速求负法:从右向左找到第一个1,这个1及其右边的位保持不变,左边的位全部取反。

  • -18的补码1110 1110→ 从右第一个1在倒数第二位,保留10,左边取反得1110 11,即1110 1110

4. 移码 (Biased Representation / Excess-K)

核心思想:真值加上一个固定偏移量K(通常K=2ⁿ⁻¹),使其全部变为非负数。

  • 公式:移码 = 真值 + 2ⁿ⁻¹
  • 等价关系:移码 = 补码的符号位取反

例子(8位,偏移量K=128):

  • +18→ 补码:0001 0010→ 移码:1001 0010(符号位取反)
  • -18→ 补码:1110 1110→ 移码:0110 1110(符号位取反)
  • 0→ 补码:0000 0000→ 移码:1000 0000(=128)

特点

  • 所有值都是非负的,便于比较大小
  • 主要用于浮点数的阶码(指数部分)
  • 比较两个移码数的大小,就是比较它们对应的真值的大小

综合对比(以4位二进制为例)

真值原码反码补码移码(K=8)
+70111011101111111
+60110011001101110
+50101010101011101
+40100010001001100
+30011001100111011
+20010001000101010
+10001000100011001
+00000000000001000
-010001111--
-11001111011110111
-21010110111100110
-31011110011010101
-41100101111000100
-51101101010110011
-61110100110100010
-71111100010010001
-8--10000000

关键区别总结

特性原码反码补码移码
0的表示两种(+0/-0)两种(+0/-0)一种一种(非零值)
表示范围(4位)-7 ~ +7-7 ~ +7-8 ~ +7-8 ~ +7(但编码全是正数)
加减运算复杂,需判断符号较简单,但有循环进位最简单,统一为加法用于比较,不做加减
硬件实现复杂较简单最简单简单
主要用途早期计算机/浮点数尾数历史过渡现代整数运算标准浮点数阶码
符号处理最高位=符号最高位=符号最高位=符号无符号(全是正数编码)
数值连续性不连续(有±0)不连续(有±0)连续连续

为什么补码成为标准?

  1. 运算统一性A - B = A + (-B),减法器不需要了
  2. 硬件简化:只需要加法器和补码转换电路
  3. 唯一零表示:避免歧义和硬件复杂度
  4. 表示范围更合理:比原码/反码多表示一个数(-2ⁿ⁻¹)

实际应用场景

  • CPU中的整数:全部使用补码表示和运算
  • 浮点数(IEEE 754)
    • 尾数部分:用原码表示(有符号绝对值)
    • 阶码部分:用移码表示(便于比较指数大小)

快速记忆技巧

  • 原码:最直观,看符号位就知道正负
  • 反码:"反"着来,负数就是取反
  • 补码:负数=反码+1,现代计算机的王者
  • 移码:给真值加个偏移量,全变正数,浮点数用它

这四种编码方式共同构成了计算机处理有符号数的理论基础,其中补码无疑是最重要、最核心的概念。

5.原码和以及反码,补码,移码能表示的整数数和小数范围

编码方式整数范围小数范围(定点)零的表示
原码-(2ⁿ⁻¹ - 1) ~ +(2ⁿ⁻¹ - 1)
例(8位): -127 ~ +127
-(1-2⁻⁽ⁿ⁻¹⁾) ~ +(1-2⁻⁽ⁿ⁻¹⁾)
例(8位): -0.992 ~ +0.992
+0 和 -0
两个零
反码-(2ⁿ⁻¹ - 1) ~ +(2ⁿ⁻¹ - 1)
例(8位): -127 ~ +127
-(1-2⁻⁽ⁿ⁻¹⁾) ~ +(1-2⁻⁽ⁿ⁻¹⁾)
例(8位): -0.992 ~ +0.992
+0 和 -0
两个零
补码-2ⁿ⁻¹ ~ +(2ⁿ⁻¹ - 1)
例(8位):-128~ +127
-1.0 ~ +(1-2⁻⁽ⁿ⁻¹⁾)
例(8位):-1.0~ +0.992
唯一零
移码真值: -2ⁿ⁻¹ ~ +(2ⁿ⁻¹ - 1)
编码: 0 ~ (2ⁿ - 1)
例(8位): 真值-128+127<br>编码0255
不用于小数表示
(主要用于浮点数阶码)
唯一零
(编码为2ⁿ⁻¹)

5.1为什么原码和反码范围相同?

5.1.1. 原码定义

原码 = 符号位 + 绝对值的二进制

  • 符号位:0正1负
  • 数值位:n-1位表示绝对值

最大正数0 111...111= +(2^{n-1}-1)
最大负数1 111...111= -(2^{n-1}-1)

5.2. 反码定义

反码 = 符号位 + 绝对值的按位取反(负数时)

  • 正数:与原码相同
  • 负数:绝对值按位取反

以4位为例

十进制 原码 反码 +3 0011 0011 ← 正数相同 -3 1011 1100 ← 负数取反

关键:反码的负数表示范围与原码完全一致:

  • 最小的负数模式:1 000...000在原码中是 -0,在反码中也是 -0
  • 最大的负数模式:1 111...111在原码中是 -(2^{n-1}-1),在反码中也是 -(2^{n-1}-1)

因为原码和反码都是1位符号号+其它数值位

5.2为什么补码比原码/反码多一个负数?

根本原因:补码重新定义了100...000的含义
二进制模式原码含义反码含义补码含义
100…000-0(无效/视为0)-0(无效/视为0)-2^{n-1}(有效负数)
补码的巧妙设计

补码中,-0的编码被重新利用来表示多一个负数:

4位时的对比

十进制原码反码补码
-8无法表示无法表示1000
-7111110001001
-6111010011010
-5110110101011
-4110010111100
-3101111001101
-2101011011110
-1100111101111
-010001111
+0000000000000

补码"偷"了-0的编码1000来表示-8,所以负数范围多一个。

5.3 移码范围

5.3.1 补码 vs 移码(以4位为例)
二进制编码补码真值移码真值移码编码值
00000-80
00011-71
00102-62
00113-53
01004-44
01015-35
01106-26
01117-17
1000-808
1001-719
1010-6210
1011-5311
1100-4412
1101-3513
1110-2614
1111-1715
5.3.2 关键区别解析
1.编码范围不同
  • 补码编码:1000(-8) ~ 0111(7)
    从-8到7,共16个数
  • 移码编码:0000(0) ~ 1111(15)
    从0到15,共16个数
2.真值范围相同
  • 两种编码都表示-8到7这16个整数
  • 只是同一个真值的编码不同
5.3.3 移码的定义与计算
1.移码公式

对于n位二进制:
[
\text{移码} = \text{真值} + 2^{n-1}
]

[
\text{移码} = \text{补码} \oplus 100…0 \ (\text{符号位取反})
]

2.举例计算
真值 = -5 n=4,偏移量 = 2³ = 8 移码 = -5 + 8 = 3 = 0011 验证: -5的补码 = 1011 符号位取反:1011 → 0011 ✓
5.3.3 为什么要有移码?
移码的主要优点:
  1. 简化比较运算

    • 移码的真值越大,编码值也越大
    • 可以直接用无符号比较器比较有符号数
  2. 浮点数阶码使用

    • IEEE 754标准中,阶码用移码表示
    • 便于处理正负指数
  3. 直观性

    • 全0编码表示最小真值(-8)
    • 全1编码表示最大真值(7)
对比示例:

比较两个数的大小:

  • 补码比较:-5(1011) vs 3(0011)
    1011 > 0011(无符号),但-5 < 3(实际)
  • 移码比较:-5(0011) vs 3(1011)
    0011 < 1011(无符号),且-5 < 3(实际一致)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 14:48:13

5分钟上手RAWGraphs:零代码制作专业数据图表的终极指南

还在为Excel数据无法转化为专业图表而烦恼吗&#xff1f;想要创建桑基图、弦图这样的高级可视化&#xff0c;却被复杂的代码吓退&#xff1f;今天我要向你介绍一个革命性的工具——RAWGraphs&#xff0c;它能让任何人在5分钟内从表格数据生成高质量的SVG矢量图表&#xff0c;全…

作者头像 李华
网站建设 2026/4/2 17:12:42

P3392 涂条纹

记录47 #include<bits/stdc.h> using namespace std; int main(){int n,m,w[55]{},b[55]{},r[55]{},cnt0;int cntW0,cntB0,cntR0;char c;cin>>n>>m;for(int i1;i<n;i){for(int j1;j<m;j){cin>>c;if(cW) w[i];if(cB) b[i];if(cR) r[i];}w[i]w[i-…

作者头像 李华
网站建设 2026/4/14 0:42:32

传统SEO需要3-6个月,为什么部分企业选择技术路径实现快速见效?

传统SEO通常需要3-6个月才能看到效果&#xff0c;这个周期对很多企业来说太长了。现在有些企业开始用技术手段缩短这个周期&#xff0c;比如生成式引擎优化&#xff08;GEO&#xff09;和AI驱动的内容优化。这篇文章聊聊为什么会出现这种变化&#xff0c;以及技术路径能带来什么…

作者头像 李华
网站建设 2026/4/1 0:01:32

Cursor试用限制突破方案:多窗口智能管理技术深度解析

还在为Cursor AI编程助手的试用限制而苦恼吗&#xff1f;当你正沉浸在代码创作的灵感迸发中&#xff0c;突然弹出的"试用请求已达上限"提示是否让你的工作戛然而止&#xff1f;别担心&#xff0c;今天我们将为你呈现一套全新的智能解决方案&#xff0c;让你彻底告别C…

作者头像 李华