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

为什么计算机使用补码存储整数:补码的本质

要理解“两个绝对值相同的有符号整数的和,舍弃进位的最高位后值为0”,需要结合 有符号整数的二进制表示(补码规则)计算机的固定位数运算特性 来拆解,核心是“符号相反、绝对值相等”的两个数在二进制层面的抵消效应。

第一步:明确前提——“绝对值相同的有符号整数”的本质

有符号整数的绝对值相同,意味着它们是 一对“相反数”(符号相反,数值部分相同)。例如:

  • 十进制:+5-5(绝对值都是5)
  • 十进制:+127-127(绝对值都是127)

在计算机中,有符号整数统一用 补码 存储(解决“正负0”和减法统一为加法的问题),补码的核心规则是:

  • 正数的补码 = 原码(二进制数值部分直接表示,最高位为符号位:0=正,1=负);
  • 负数的补码 = 其“绝对值的原码”按位取反 + 1(符号位为1)。

第二步:以具体例子看二进制运算过程

8位有符号整数 为例(计算机中整数运算有固定位数,如8/16/32位,超出位数的进位会被舍弃),用“+5”和“-5”演示:

1. 先写出两个数的补码
  • +5(正数)
    符号位=0,数值部分=5的二进制(0000101),所以8位补码为:0000 0101

  • -5(负数)
    先取绝对值5的原码(0000 0101)→ 按位取反(1111 1010)→ 加1(1111 1011),所以8位补码为:1111 1011

2. 计算两数的和(二进制加法)

二进制加法规则:0+0=00+1=11+1=10(本位写0,向高位进1)。
+50000 0101)和 -51111 1011)相加:

  0000 0101  (+5的补码)
+ 1111 1011  (-5的补码)
-----------
1 0000 0000  (结果:本位和为0000 0000,最高位产生进位1)
3. 关键:舍弃“进位的最高位”

8位整数的运算结果只能保留8位,超出的“最高位进位1”会被直接舍弃,最终结果为:0000 0000(对应十进制的0)。

第三步:抽象本质——“相反补码”的加法抵消

为什么会出现这种结果?核心是 负数补码的设计恰好让“正数+负数(绝对值相等)”的二进制和为“全0+进位1”

  1. 设正数的补码为 X(符号位0,数值部分为 a),则其绝对值的原码就是 a
  2. 负数的补码为 ~a + 1(符号位1,数值部分是 a 取反加1);
  3. 两数相加:X + (~a + 1) = (0 + a) + (~a + 1) = (a + ~a) + 1

an 位二进制数(n 为数值部分位数),a + ~a 的结果是 全1(例如 a=0000101~a=1111010,和为 1111111);
再加上1后,全1 + 1 = 1000...0n+1位,本位全0,最高位进1)。

当计算机按固定位数(如8位)存储时,进位的1被舍弃,剩下的就是 全0,对应十进制的0。

第四步:扩展到任意位数(非8位)

无论整数是16位、32位还是64位,规律完全一致。例如32位有符号整数 +10-10

  • +10 补码:00000000 00000000 00000000 00001010
  • -10 补码:11111111 11111111 11111111 11110110
  • 相加结果:1 00000000 00000000 00000000 00000000
  • 舍弃进位后:00000000 00000000 00000000 00000000(即0)。

总结

“两个绝对值相同的有符号整数的和,舍弃进位最高位后为0”,本质是 计算机用补码表示负数时,相反数的二进制补码相加会产生“全0结果+进位1”,而固定位数运算会舍弃超出的进位,最终结果自然为0。这也是计算机中“减法转化为加法”(a - b = a + (-b))能正确运算的底层逻辑基础。

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

相关文章:

  • 【秋招笔试】2025.08.29阿里云秋招笔试题
  • 【Linux】动静态库的制作与原理
  • 第三十二天:数组
  • 刷算法题-数组-02
  • 关于Ctrl+a不能全选的问题
  • Wi-Fi技术——OSI模型
  • VS安装 .NETFramework,Version=v4.6.x
  • React Hooks useMemo
  • [强网杯2019]随便注-----堆叠注入,预编译
  • centos7挂载iscis存储操作记录
  • postman 用于接口测试,举例
  • postman带Token测试接口
  • DAY50打卡
  • Redis 持久化 AOF 与 RDB 的区别
  • Ruoyi-vue-plus-5.x第二篇MyBatis-Plus数据持久层技术:2.1 MyBatis-Plus核心功能
  • audioLDM模型代码阅读(五)—— pipeline
  • Python学习大集合:基础与进阶、项目实践、系统与工具、Web 开发、测试与运维、人工智能(视频教程)
  • 电力电子技术知识学习-----晶闸管
  • VSCode中使用Markdown
  • 从零开始学炒股
  • cordova+umi 创建项目android APP
  • PythonDay42
  • KNN算法常见面试题
  • C数据结构:排序
  • 第25章学习笔记|额外的提示、技巧与技术(PowerShell 实战版)
  • Qt Core 之 QString
  • PyTorch 张量(Tensor)详解:从基础到实战
  • 【深度学习】配分函数:近似最大似然与替代准则
  • python复杂代码如何让ide自动推导提示内容
  • 编写Linux下usb设备驱动方法:disconnect函数中要完成的任务