news 2026/1/11 5:06:58

四种有符号数编码方式

作者头像

张小明

前端开发工程师

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/1/11 3:30:00

ComfyUI高级Redux控制:彻底掌握AI图像生成效果调节

ComfyUI_AdvancedRefluxControl是一个功能强大的开源项目&#xff0c;专门用于增强ComfyUI的Redux模型控制能力。该项目通过自定义节点实现了对Redux效果强度的精确调节&#xff0c;支持图像遮罩和非方形图像处理&#xff0c;让用户能够灵活控制最终图像的生成效果。无论你是想…

作者头像 李华
网站建设 2025/12/12 16:36:07

Gitee DevOps:信创时代企业数字化转型的引擎

Gitee DevOps&#xff1a;信创时代企业数字化转型的引擎 在信息技术应用创新产业快速发展的背景下&#xff0c;Gitee DevOps平台以其全面的技术适配能力和高效的研发流程管理&#xff0c;正在重塑企业数字化研发的新范式。作为国内领先的DevOps解决方案提供商&#xff0c;该平台…

作者头像 李华
网站建设 2026/1/10 19:04:55

直播平台运营管理真心话:可靠的直播系统开发搭建公司这么选

运营教你算明白账&#xff1a;选直播系统源码或定制开发比低价更重要的是长期盈利能力在直播行业蓬勃发展的今天&#xff0c;越来越多的创业者和企业希望搭建自己的直播平台。作为有过直播平台运营经验的管理者&#xff0c;您可能会遇到朋友或同行前来咨询&#xff1a;是该投入…

作者头像 李华
网站建设 2026/1/3 6:31:11

如何彻底释放AMD处理器潜能:RyzenAdj深度调优完整指南

如何彻底释放AMD处理器潜能&#xff1a;RyzenAdj深度调优完整指南 【免费下载链接】RyzenAdj Adjust power management settings for Ryzen APUs 项目地址: https://gitcode.com/gh_mirrors/ry/RyzenAdj 你是否曾经在使用AMD Ryzen处理器时感受到性能瓶颈&#xff1f;或…

作者头像 李华
网站建设 2026/1/5 2:30:07

P2692 覆盖

记录46 #include<bits/stdc.h> using namespace std; int main(){int a[5010]{},c[5010]{};int n,m,b,g,s,e,cnt0,cnt_x0;cin>>n>>m>>b>>g;while(b--){cin>>s>>e;for(int is;i<e;i) a[i]1;}while(g--){cin>>s>>e;fo…

作者头像 李华