计算机系统基础2---值的表示1---原码、反码、补码、移码

文章目录

在计算机系统中,原码、补码、反码和移码是数值数据(尤其是有符号数)的四种关键编码方式,它们在二进制表示、运算规则和应用场景上各有特点。

1. 原码(Sign-Magnitude Representation)

定义

原码是最直观的数值表示方法,最高位为符号位(0表示正数,1表示负数),其余位表示数值的绝对值。

示例

以8位二进制为例:

+5 的原码:0000 0101

-5 的原码:1000 0101

特点

直观性:符号位直接表示正负,易于理解。

问题:

1、0的表示不唯一:存在+0(00000000)和-0(10000000)两种形式。

2、运算复杂:加减法需判断符号位,无法直接用加法实现减法(如5 - 3需转换为5 + (-3),但原码的加法规则复杂)。

应用场景

早期计算机系统或教学场景中用于理解符号位的概念。

2. 反码(Ones' Complement Representation)

定义

反码是对原码的改进,负数的反码是其原码按位取反(符号位不变)。正数的反码与原码相同。

示例

8位二进制:

+5 的反码:00000101(与原码相同)

-5 的反码:11111010(原码10000101取反)

特点

解决部分运算问题:反码的加法可通过"末位进位循环"实现减法(如5 - 3可转换为5 + (-3)的反码加法)。

问题:

1、0的表示仍不唯一:+0为00000000,-0为11111111。

2、高位溢出:运算时可能产生进位循环,需额外处理。

应用场景

早期计算机系统(如CDC系列)中用于简化减法运算。

3. 补码(Two's Complement Representation)

定义

补码是当前计算机系统中最常用的数值表示方法。负数的补码是其反码的末位加1(即"取反加1")。正数的补码与原码相同。

示例

8位二进制:

+5 的补码:00000101(与原码相同)

-5 的补码:11111011(反码11111010加1)

特点

统一加减法:通过补码,减法可完全转换为加法(如a - b = a + (-b)的补码),简化硬件设计。

0的表示唯一:0的补码为00000000,无-0的概念。

范围对称:n位补码可表示的范围为-2^ (n-1) 到 2^(n-1) -1(如8位补码范围为-128到127)。

溢出处理:运算结果超出范围时,高位自然丢弃(模运算特性)。

应用场景

现代计算机系统(如x86、ARM架构)中所有整数运算均使用补码。

4. 移码(Excess-K Representation)

定义

移码主要用于表示浮点数的阶码(Exponent),其值通过补码的符号位取反得到(即移码 = 补码 + 偏移量,偏移量通常为2^(n-1),n为阶码位数)。

示例

(8位移码,偏移量=128)

阶码真值0的移码:10000000(补码00000000 + 128)

阶码真值-1的移码:01111111(补码11111111 + 128,取低8位)

特点

便于比较:移码将阶码的真值范围映射到无符号数区间,可直接比较大小(如10000001(真值+1) > 10000000(真值0))。

无正负之分:移码本身不区分正负,仅通过数值大小表示阶码的真值。

与补码的关系:移码与补码仅符号位不同,其余位相同。

应用场景

IEEE 754浮点数标准中阶码的编码方式(如单精度浮点数的8位阶码使用移码表示)。

总结对比

编码方式 符号位 负数表示方法 0的表示 运算特点 典型应用
原码 最高位 绝对值直接表示 不唯一(+0/-0) 加减法需判断符号 早期教学
反码 最高位 原码按位取反 不唯一(+0/-0) 末位进位循环 早期计算机
补码 最高位 反码末位加1 唯一(000...000) 统一加减法 现代计算机
移码 无(通过补码转换) 补码 + 偏移量 无意义(仅表示阶码) 便于比较大小 浮点数阶码

表示范围

编码方式 8位表示范围 关键特性
原码 -127 ~ +127 直观,但存在 ±0 冗余,运算复杂。
反码 -127 ~ +127 解决部分运算问题,但仍存在 ±0 冗余。
补码 -128 ~ +127 消除 ±0 冗余,统一加减法,成为现代计算机标准。
移码 -128 ~ +127 用于浮点数阶码,符号位取反,便于比较大小。

编码间转换

原码 ↔ 反码

1、正数

原码 → 反码:数值部分不变,符号位保留。

示例:

+5(原码 00000101)→ 反码 00000101

2、负数

原码 → 反码:符号位保留,数值部分按位取反(0变1,1变0)。

示例:

-5(原码 10000101)→ 反码 11111010

反码 → 原码:符号位保留,数值部分按位取反。

示例:

反码 11111010 → 原码 10000101(即 -5)

反码 ↔ 补码

1、正数

反码 → 补码:数值部分不变,符号位保留。

示例:

+5(反码 00000101)→ 补码 00000101

2、负数

反码 → 补码:符号位保留,数值部分末位加1(可能产生进位)。

示例:

-5(反码 11111010)→ 补码 11111011(末位加1)

补码 → 反码:符号位保留,数值部分末位减1(若末位为0需连续借位)。

示例:

补码 11111011 → 反码 11111010(末位减1)

原码 ↔ 补码

1、正数

原码 ↔ 补码:数值部分和符号位均不变。

示例:

+5(原码 00000101)↔ 补码 00000101

2、负数

原码 → 补码:

符号位保留,数值部分按位取反(得到反码)。

反码的数值部分末位加1(得到补码)。

示例:

-5(原码 10000101)→ 反码 11111010 → 补码 11111011

补码 → 原码:

符号位保留,数值部分末位减1(得到反码)。

反码的数值部分按位取反(得到原码)。

示例:

补码 11111011 → 反码 11111010 → 原码 10000101(即 -5)

补码 ↔ 移码

补码 → 移码:符号位取反,其余位不变。

示例:

补码 11111011(-5)→ 移码 01111011(真值 -5 + 128 = 123)

移码 → 补码:符号位取反,其余位不变。

示例:

移码 01111011(真值 123)→ 补码 11111011(-5)

数学关系:

偏移量为128

移码值 = 补码值 + 偏移量

补码值 = 移码值 - 偏移量

相关推荐
ChenYY~18 小时前
入门分享篇:一、工欲善其事,必先利其器
计算机·程序员·机器人·嵌入式·typora·工具·软件开发·obsidian
梁辰兴2 天前
计算机网络基础:超文本传输协议 HTTP
网络协议·计算机网络·http·计算机·超文本传输协议·计算机网络基础·梁辰兴
乐茵lin3 天前
github开源项目 “校园活动平台“ —— 报名活动二维码生成核销流程详解
计算机·微服务·golang·开源·github·大学生·zero
程序员鱼皮4 天前
40 个 Agent Skills 精选资源:入门教程 + 实用工具 + 必装推荐
前端·后端·计算机·ai·程序员·互联网·编程
梁辰兴5 天前
计算机网络基础:远程终端协议 Telnet
网络·计算机网络·计算机·telnet·计算机网络基础·梁辰兴·远程终端协议
BHXDML5 天前
线上事故发生时,你第一反应是什么?
linux·运维·服务器·计算机
程序员鱼皮6 天前
全网最简单的 OpenClaw 部署教程,5 分钟拥有你的 AI 员工
计算机·ai·程序员·互联网·网站
梁辰兴6 天前
计算机网络基础:域名系统 DNS
网络·计算机网络·计算机·dns·域名系统·计算机网络基础·梁辰兴
程序员鱼皮10 天前
刚刚,Claude Opus 4.6 和 GPT-5.3-Codex 同时炸场!AI 编程要变天了
计算机·ai·程序员·互联网·软件开发