惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
C
CXSECURITY Database RSS Feed - CXSecurity.com
V
Visual Studio Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
小众软件
小众软件
L
LangChain Blog
Cyberwarzone
Cyberwarzone
美团技术团队
The Register - Security
The Register - Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tor Project blog
V
V2EX
Security Archives - TechRepublic
Security Archives - TechRepublic
Hacker News: Ask HN
Hacker News: Ask HN
L
LINUX DO - 最新话题
Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
aimingoo的专栏
aimingoo的专栏
人人都是产品经理
人人都是产品经理
F
Full Disclosure
V2EX - 技术
V2EX - 技术
The Cloudflare Blog
博客园 - 叶小钗
T
Threat Research - Cisco Blogs
阮一峰的网络日志
阮一峰的网络日志
G
GRAHAM CLULEY
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Latest news
Latest news
S
Security @ Cisco Blogs
Spread Privacy
Spread Privacy
Project Zero
Project Zero
K
Kaspersky official blog
MyScale Blog
MyScale Blog
Attack and Defense Labs
Attack and Defense Labs
云风的 BLOG
云风的 BLOG
博客园 - 【当耐特】
Hacker News - Newest:
Hacker News - Newest: "LLM"
大猫的无限游戏
大猫的无限游戏
P
Privacy International News Feed
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
C
Cybersecurity and Infrastructure Security Agency CISA
Webroot Blog
Webroot Blog
罗磊的独立博客
Vercel News
Vercel News
N
News and Events Feed by Topic
A
Arctic Wolf
C
CERT Recently Published Vulnerability Notes

博客园 - 欢乐豆123

软件设计师考试 - 有限自动机 软件设计师考试 - 排序算法 哈夫曼树以及哈夫曼编码 软件设计师案例题型 - DFD(数据流图) 软件设计师考试 - 二分查找 软件设计师考试 - Gantt图与PERT图(项目管理) 软件设计师考试 - 上午题型分析 软件设计师考试 - 下午题型分析 软件设计师考试-应用技术 内存溢出问题 常见的算法类型 排序算法的介绍 微信生态梳理 海明码介绍 Elasticsearch 实战:基于 function_score 的搜索与权重排序 Nexus的简单介绍以及如何上传自定义包 设计模式-桥接模式(Bridge Pattern) 设计模式简介 jmeter压测 sdkman-管理多个版本的JDK SpringBoot中使用Aop统一拦截MQ消息处理 项目管理流程以及规范 Java-泛型的使用
软件设计师考试 - 数据表示(原码、反码、补码、移码)
欢乐豆123 · 2026-02-14 · via 博客园 - 欢乐豆123

软件设计师考试 - 数据表示(原码、反码、补码、移码)

   概要 

   计算机只认识 0 和 1,但现实世界中既有正数,也有负数。当计算机刚诞生时,人们面临一个基础问题:如何用二进制表示带符号的整数?

   围绕这个问题,工程师们经历了一次逐步演进的探索过程,于是出现了四种数据表示方式:原码、反码、补码、移码

   它们不是同时诞生的,而是在不断解决问题的过程中逐步演化出来的。

   一、原码(最直观的表示方式)

   1. 定义

   原码是一种最自然、最直观的带符号整数表示方式。

   规则如下:

  • 最高位为符号位
  • 0 表示正数
  • 1 表示负数
  • 其余位表示数值的绝对

    简单来说:原码 = 符号位 + 数值的二进制表示

    2. 举例说明

    | 十进制 |   原码表示  |
    | ----- | --------- |
    | +5      | 0000 0101   |
    | -5      | 1000 0101    |
   解释:

   +5:符号位 0,数值部分 0000101

   -5:符号位 1,数值部分 0000101

   可以看到,正负数只有最高位不同。

   3. 原码的优点

   表示方式直观、容易理解、符号与数值分离清晰

   这也是为什么在学习计算机组成原理时,通常会先介绍原码。

   4. 原码的缺点

   虽然直观,但原码存在明显问题:

   1)存在两个 0
   +0 = 0000 0000
   -0 = 1000 0000

   计算机中出现两个 0,会增加逻辑复杂度。

   2)运算复杂

   例如计算:5 + (-5)

   如果使用原码,符号和数值需要分开判断处理,不能直接用普通加法完成。这会使硬件设计变得复杂。

   二、反码(对原码的改进尝试)

   1.  定义

   反码是在原码基础上的一种改进方案,目的是让减法运算更容易实现。

   规则如下:

  • 正数的反码 = 原码
  • 负数的反码 = 符号位不变,其余各位按位取反

   也就是说:反码 = 原码(正数不变,负数除符号位外全部取反

   2.  举例说明(以 8 位二进制为例)

   以 5 为例:
   | 十进制 | 原码 | 反码 |
   | --- | --------- | --------- |
   | +5   | 0000 0101   | 0000 0101   |
   | -5   | 1000 0101    | 1111 1010     |

  解释:

  -5 原码:1000 0101

  -5 反码:除符号位外取反:1111 1010

  3.  反码的优点

  减法可以部分转化为加法

  比原码更接近实际运算需求

  4.  反码的缺点

  1)仍然存在两个 0

  +0 = 0000 0000
  -0 = 1111 1111

  双零问题依然存在。

  2)运算规则仍然不够简洁

  反码加法在出现进位时,需要“末位回卷”(循环加 1),增加了电路复杂度。

  小结:反码是对原码的一次改进,但并没有彻底解决问题。于是,人们继续优化,最终得到了更完美的方案 —— 补码。

  三、补码(现代计算机采用的表示方式)
  1. 定义

  补码是在反码基础上进一步改进得到的。

  规则如下:

  • 正数的补码 = 原码
  • 负数的补码 = 反码 + 1

  也可以理解为:负数补码 = 对原码(除符号位外)取反,再加 1

  2. 举例说明(以 8 位二进制为例)

  以 -5 为例:

  原码:1000 0101

  反码:1111 1010

  补码:1111 1011
   | 十进制   |   补码          |
   | ---       | --------- |
   | +5         | 0000 0101 |
   | -5         | 1111 1011    |

  3.  补码的优点

  1)只有一个 0

  表示为: 0000 0000

  解决了双零问题。

  2)加减法可以统一

  表示为: 5 + (-5)

  补码表示:

   0000 0101
  +1111 1011
  -----------
  1 0000 0000

  丢弃最高位进位,结果为:0000 0000。运算过程完全等同于普通二进制加法

  3)硬件实现简单

  计算机只需要一套加法电路,就可以完成加法和减法。

  这大大降低了硬件复杂度。

  4. 表示范围(8 位)

  最小值:1000 0000 → -128

  最大值:0111 1111 → 127

  表示范围为:-128 ~ 127

   5. 小结

   补码彻底解决了-双零问题、运算复杂问题、硬件实现复杂问题。因此,现代计算机全部采用补码表示整数。

   四、移码(主要用于浮点数)

   1. 定义

   移码是在补码基础上的一种变形形式。

   规则:

  • 移码 = 补码的符号位取反
  • 或者从数学角度理解:在原数值基础上加上一个固定偏移量(Bias)

   2. 举例说明(8 位)

   以 -5 为例:

   补码:1111 1011

   移码:0111 1011

   移码的特点:

  • 没有符号位的负数表示
  • 所有数看起来都是“无符号数”
  • 非常方便比较大小

    说明:移码是另一种负数表示法,主要用于浮点数的阶码或某些特殊整数运算。它的特点是没有单独的符号位,而是通过“整体加上一个偏移量”来表示正负。

   3. 应用场景

   移码主要用于:

  • 浮点数的指数部分
  • 科学计数法表示
  • 在 IEEE754 标准中,指数部分就是采用移码表示。

   4. 小结

  移码并不是用来表示普通整数的,而是为浮点数设计的一种特殊编码方式

  五、最终总结对比

  | 编码方式   | 是否有两个 0 | 运算是否方便 | 实际是否使用 |
  | ----        | -------    | ------        | ------    |
  | 原码          |      有        |      否           |   不使用    |
  | 反码          |      有        |      一般        |   不使用    |
  | 补码          |      无        |      是           |   使用       |
  | 移码          |      无        |      用于比较  |   用于浮点 |

  原码、反码、补码的概念只对负数有实际意义,对于正数,它们都一样。

​  +9    ->   +0001001   -> 00001001  -> 00001001  ->  0 0001001
​  -9    ->   -0001001   -> 1001001    ->  11110110    ->  1 1110111
 (十进制数) (真值)        (原码)          (反码)       (补码)

 表示范围:

image

  在计算机内存中,整数一律采用补码的形式来存储。这意味着,当读取整数时还要采用逆向的转换,也就是将补码转换为原码。
  将负数的补码转换为原码也很简单:先减去 1,再将数值位取反即可。