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

推荐订阅源

Know Your Adversary
Know Your Adversary
博客园 - 叶小钗
量子位
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 【当耐特】
博客园 - Franky
有赞技术团队
有赞技术团队
博客园 - 聂微东
腾讯CDC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Jina AI
Jina AI
Last Week in AI
Last Week in AI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cloudbric
Cloudbric
WordPress大学
WordPress大学
W
WeLiveSecurity
V2EX - 技术
V2EX - 技术
博客园_首页
S
Security @ Cisco Blogs
The Last Watchdog
The Last Watchdog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Security Latest
Security Latest
L
Lohrmann on Cybersecurity
T
Threat Research - Cisco Blogs
Forbes - Security
Forbes - Security
宝玉的分享
宝玉的分享
The Register - Security
The Register - Security
The Hacker News
The Hacker News
B
Blog RSS Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
Schneier on Security
Schneier on Security
T
Troy Hunt's Blog
The GitHub Blog
The GitHub Blog
Hacker News: Ask HN
Hacker News: Ask HN
Spread Privacy
Spread Privacy
Hugging Face - Blog
Hugging Face - Blog
博客园 - 三生石上(FineUI控件)
GbyAI
GbyAI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
罗磊的独立博客
Blog — PlanetScale
Blog — PlanetScale
M
MIT News - Artificial intelligence
T
Tor Project blog
S
Security Affairs
Security Archives - TechRepublic
Security Archives - TechRepublic
NISL@THU
NISL@THU
P
Proofpoint News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security

博客园 - 一个人的合唱

手写简易docker synchronized 泛型学习 解决128位秘钥长度限制的方法 CAP学习 ThreadLocal的学习 读书笔记脑图列表 a=a++和a=++a centos7下安装python3 深入理解jvm虚拟机笔记(二) AtomicInteger的使用 volatile学习 echarts重新绘制的时候数据未更新 深入理解jvm虚拟机笔记(一) elasticsearch学习笔记 使用fiddler模拟post请求 二叉堆 二叉平衡树 二叉查找树
反码与补码
一个人的合唱 · 2026-03-18 · via 博客园 - 一个人的合唱

数学里 减去一个数等于跟它的负数相加 所以计算机底层其实只有加法器没有减法器 可以将要减去的值转换成它的负数形式 然后用加法器进行相加

实现

​ 以Java的int类型为例 它32位 第1位是符号位 0是表示是正的 1表示是负的 其余31位表示值的大小 数值范围为 - 2^31 到 2^31 - 1 (0占去了一个位置) 超出范围是发生溢出 需要像Hashmap求槽位那样取模取余数 除数为 2^32 因此对于int类型的 i 和 j来说 i - j = i - j + 2 ^32 两者用int来表示 是一样的
​ 假如 j 是正整型 其二进制表示为 0 ? ... ? 0代表其为正数 2 ^ 32 - 1 的二进制表示是32位1 那么2 ^ 32 - 1 - j 在二进制运算里 假设 j 的二进制表示的第n位为1 那么2 ^ 32 - 1 - j 结果的第 n 位就是0 如果j的第 n 位为 0 那么2 ^ 32 - 1 - j 结果的第 n 位就是1 因此2 ^ 32 - 1 - j 相当于对 j 除了符号位外全都取反
​ 负j的二进制表示为 1 ? ... ? 除了符号位 后面那串跟j完全相同 将后面那串用a表示 那么 j 为 0..a 负 j 为 1.. a 负数的反码为除符号位外 其他位置全部取反 那么负j的反码为1..(对a取反) 而2 ^ 32 - 1 - j 的第一位是1 剩下部分是除了符号位外对j取反 因此2 ^ 32 - 1 - j 可以表示为 1..(对a取反) 所以负j的反码就是 2 ^ 32 - 1 - j
​ 所以 i - j = i - j + 2 ^32 = i + (2 ^32 - 1 - j) + 1 = i + 负j的反码)+ 1 把负 j 的 反码 + 1定义为 负j 的补码 那么i - j 就等于 i + (负j的补码 ) 所以无论遇到减法 得到其负数的补码再相加就行