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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 一个人的合唱

手写简易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的补码 ) 所以无论遇到减法 得到其负数的补码再相加就行