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

推荐订阅源

博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
月光博客
月光博客
AI
AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
CXSECURITY Database RSS Feed - CXSecurity.com
WordPress大学
WordPress大学
GbyAI
GbyAI
L
Lohrmann on Cybersecurity
O
OpenAI News
Schneier on Security
Schneier on Security
P
Palo Alto Networks Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Troy Hunt's Blog
V2EX - 技术
V2EX - 技术
W
WeLiveSecurity
L
LINUX DO - 最新话题
人人都是产品经理
人人都是产品经理
S
Security Affairs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
Arctic Wolf
Recorded Future
Recorded Future
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
TaoSecurity Blog
TaoSecurity Blog
C
Check Point Blog
Scott Helme
Scott Helme
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
PCI Perspectives
PCI Perspectives
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Vercel News
Vercel News
The Hacker News
The Hacker News
Y
Y Combinator Blog
Latest news
Latest news
SecWiki News
SecWiki News
Hugging Face - Blog
Hugging Face - Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Webroot Blog
Webroot Blog
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Cisco Blogs
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
宝玉的分享
宝玉的分享
L
LINUX DO - 热门话题

博客园 - 欢乐豆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,再将数值位取反即可。