当前位置: 首页 > news >正文

C语言中整数编码方式(原码、反码、补码)

在 C 语言中,原码、反码、补码的运算规则与其编码特性密切相关,核心差异体现在符号位是否参与运算、进位如何处理以及减法是否能转化为加法等方面。以下是三者的运算规则及特点分析(以 8 位整数为例,符号位为最高位):

一、原码的运算规则

原码是 “符号位 + 数值绝对值” 的直接表示,其运算规则需单独处理符号位,且加法和减法需分开逻辑,灵活性差。

1. 加法运算
  • 若两数符号相同(同正或同负):

符号位不变(仍为 0 或 1),数值位直接相加;若数值位相加后有进位,结果可能溢出(超出表示范围)。

示例:+3(00000011) + +5(00000101)

符号位均为 0,数值位相加:0000101 + 000011 = 0001000,结果为00001000(+8,正确)。

  • 若两数符号不同(一正一负):

需先比较两数数值位的绝对值大小,用 “大绝对值 - 小绝对值”,结果的符号取 “绝对值大的数” 的符号。

示例:+5(00000101) + (-3)(10000011)

绝对值 5 > 3,符号取正(0),数值位相减:0000101 - 0000011 = 0000010,结果为00000010(+2,正确)。

2. 减法运算

原码减法需转化为 “被减数 + 减数的相反数”,再按加法规则处理(符号相反时的加法逻辑)。

示例:+5(00000101) - (+3)(00000011)

等价于 +5 + (-3),按符号不同的加法规则计算,结果为 + 2(正确)。

原码运算的缺陷
  • 符号位需单独判断,运算逻辑复杂(需比较绝对值、区分加减);
  • 存在两个 0(+0 和 - 0),可能导致运算结果歧义;
  • 实际中几乎不用于计算机运算(仅用于直观表示)。

二、反码的运算规则

反码是原码到补码的过渡编码,其运算规则允许符号位参与运算,但需处理 “循环进位”(最高位进位需回加到最低位),可实现减法转加法,但仍有缺陷。

1. 加法运算
  • 符号位与数值位一起参与加法(按二进制加法规则,逢 2 进 1);
  • 若最高位(符号位)产生进位,需将该进位 “循环” 加到结果的最低位(称为 “循环进位”);
  • 运算结果仍为反码,需转换为原码才能得到实际值。

示例 1:+3(反码00000011) + +5(反码00000101)

直接相加:00000011 + 00000101 = 00001000(无进位),结果反码为 00001000,对应原码 + 8(正确)。

示例 2:+5(反码00000101) + (-3)(反码11111100)

相加:00000101 + 11111100 = 100000001(最高位产生进位 1);

循环进位:将进位 1 加到最低位,00000001 + 1 = 00000010;

结果反码为 00000010,对应原码 + 2(正确)。

示例 3:+1(反码00000001) + (-1)(反码11111110)

相加:00000001 + 11111110 = 11111111(无进位);

结果反码为 11111111,对应原码 - 0(存在双 0 问题,不完美)。

2. 减法运算

反码减法可直接转化为 “被减数 + 减数的反码”(因负数的反码是其相反数的反码),再按加法规则处理(含循环进位)。

示例:+5 - (+3) 等价于 +5 + (-3),同上述示例 2,结果正确。

反码运算的缺陷
  • 需处理循环进位,硬件实现稍复杂;
  • 仍存在 - 0(11111111),导致 0 的表示不唯一;
  • 未彻底解决运算问题,仅作为补码的过渡。

三、补码的运算规则

补码是计算机中实际使用的编码,其运算规则最简单:符号位直接参与运算,进位直接丢弃,减法可完美转化为加法,且结果唯一正确。

1. 加法运算
  • 符号位与数值位一起参与加法(按二进制加法规则,逢 2 进 1);
  • 若最高位(符号位)产生进位,直接丢弃该进位(因超出位数的部分不影响结果);
  • 运算结果仍为补码,无需额外处理即可表示正确值。

示例 1:+3(补码00000011) + +5(补码00000101)

相加:00000011 + 00000101 = 00001000(无进位),结果补码为 00001000,对应 + 8(正确)。

示例 2:+5(补码00000101) + (-3)(补码11111101)

相加:00000101 + 11111101 = 100000010(最高位产生进位 1);

丢弃进位:结果为 00000010,对应 + 2(正确)。

示例 3:+1(补码00000001) + (-1)(补码11111111)

相加:00000001 + 11111111 = 100000000(进位 1);

丢弃进位:结果为 00000000(唯一的 0,正确)。

2. 减法运算

补码减法可直接转化为 “被减数 + 减数的补码”(因减去一个数 = 加上它的相反数,而负数的补码是其相反数的补码),再按加法规则处理(进位丢弃)。

公式:a - b = a + (-b)的补码

示例:+5 - (+3) = +5 + (-3)的补码

-3 的补码为 11111101,相加结果同示例 2,得 + 2(正确)。

补码运算的优势
  • 符号位自然参与运算,无需单独判断;
  • 减法完全转化为加法,简化硬件设计(只需加法器);
  • 只有一个 0(00000000),结果无歧义;
  • 进位直接丢弃,逻辑简单,是计算机中整数运算的唯一实现方式。

四、无符号数的运算规则

无符号数(unsigned)没有符号位,其原码、反码、补码完全相同(即二进制数值本身),运算规则为:

  • 加法:按二进制加法,进位直接丢弃(超出位数的部分无效);
  • 减法:按二进制减法,若被减数小于减数,结果为 “模” 减去(减数 - 被减数)(等价于补码运算,因无符号数的补码即自身)。

示例(8 位无符号数):5 - 10

等价于 5 + (256 - 10) = 5 + 246 = 251(因 8 位无符号数的模为 256),结果为 251(正确,无符号数减法的 “借位” 通过模运算处理)。

总结

编码

加法规则

减法规则

核心特点

原码

符号位单独处理,异号需比较绝对值

转化为 “被减数 + 相反数”,同加法

逻辑复杂,有双 0,几乎不用

反码

符号位参与运算,进位循环到最低位

转化为 “被减数 + 减数的反码”

需循环进位,仍有 - 0,过渡编码

补码

符号位参与运算,进位直接丢弃

转化为 “被减数 + 减数的补码”

逻辑简单,无歧义,计算机实际使用

补码的运算规则是 C 语言中整数存储和运算的基础,理解其规则可解释负数运算、溢出(如int a = 127 + 1结果为 - 128)等现象。

http://www.xdnf.cn/news/1112563.html

相关文章:

  • Gitee Push 失败 7 日谈:每天一个踩坑故事
  • 【InnoDB磁盘结构1】系统表空间,独立表空间,双写缓冲区
  • C语言基础知识--联合体
  • ICCV2025 特征点检测 图像匹配 RIPE
  • 缺陷特征粘贴增强流程
  • 过拟合 跷跷板 幻觉 混合精度
  • 学习笔记 Datewhale MCP Server Task2
  • Windows安装SSH
  • 【Java入门到精通】(二)Java基础语法(上)
  • [ABC267F] Exactly K Steps
  • 零基础 “入坑” Java--- 九、类和对象(二)
  • 车载操作系统 --- Linux实时化与硬实时RTOS综述
  • 数据结构——散列表
  • 【PTA数据结构 | C语言版】用两个栈实现队列
  • 【GESP】C++ 2025年6月一级考试-客观题真题解析
  • MoE(混合专家模型):大模型时代的“模块化超级大脑”——从原理到实战的深度革命
  • 初识JDBC
  • GPU编程入门:CUDA与OpenCL全面解析
  • C语言基础知识--动态内存管理
  • 【时间之外】AI在农机配件设计场景的应用
  • bp使用爆破模块破解pikachu的登陆密码
  • java堆的创建与基础代码解析(图文)
  • BKD 树(Block KD-Tree)Lucene
  • TCP与UDP协议详解:网络世界的可靠信使与高速快递
  • UnityShader——SSAO
  • 微信小程序121~130
  • 时序分解 | Matlab基于GWO-FMD基于灰狼算法优化特征模态分解-2025-7-12
  • 直播录屏技术揭秘:以抖音直播录屏为例
  • LLM 不知道答案,但是知道去调用工具获取答案?
  • 基于STM32F412+RT-Thread的智能汽车CAN通信仪表盘