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

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

要理解“两个绝对值相同的有符号整数的和,舍弃进位的最高位后值为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.dtcms.com/a/360413.html

相关文章:

  • 自定义AXI_PWM_v1.0——ZYNQ学习笔记15
  • Ultra Low Power Transceiver for Wireless Body Area Networks中文版
  • Makefile语句解析:头文件目录自动发现与包含标志生成
  • Day 01(01): Hadoop与大数据基石
  • RPC个人笔记(包含动态代理)
  • Qwen2.5-VL代码初步解读
  • 一个从7zip中分离出来的高压缩比文本压缩工具ppmd
  • 使用PowerShell监听本地端口
  • 多线程案例、线程池
  • QT6(QStandardItemModel和QTableView及自定义代理)
  • 第3章 乱码的前世今生-字符集和比较规则
  • 部署在windows的docker中的dify知识库存储位置
  • 常见线程池的创建方式及应用场景
  • Cookie、Session 和 JWT
  • 【K8s-Day 22】深入解析 Kubernetes Deployment:现代应用部署的基石与滚动更新的艺术
  • 服装管理软件与工厂计件系统精选
  • 【OpenGL】LearnOpenGL学习笔记18 - Uniform缓冲对象UBO
  • [每周一更]-(第158期):构建高性能数据库:MySQL 与 PostgreSQL 系统化问题管理与优化指南
  • XPlayer播放器APP:安卓平台上的全能视频播放器
  • 网络代理协议深度对比
  • Linux/UNIX系统编程手册笔记:系统和进程信息、文件I/O缓冲、系统编程概念以及文件属性
  • Multi-Head RAG: Solving Multi-Aspect Problems with LLMs
  • ST-2110概述
  • MySQL专题Day(1)————事务
  • postman 用于接口测试,举例
  • Linux shell 脚本基础 003
  • centos7安装jdk17
  • c++程序员日常超实用工具(长期记录更新)
  • PS自由变换
  • 【人工智能99问】LLaMA中的RoPE是什么?(35/99)