如何理解有符号数在计算机中用补码存储
文章目录
- **🚗 汽车里程表模型(8位补码)**
- **规则 1:正数就是正常数字**
- **规则 2:负数 = “从最大值倒着走”**
- **🔢 补码的运算:减法变加法**
- **例子:计算 `7 - 5`**
- **❓ 为什么补码这么设计?**
- **1. 减法变加法(CPU 省事!)**
- **2. 零只有一种表示(不浪费!)**
- **3. 溢出自动处理(像钟表一样循环)**
- **🎯 补码速记口诀**
- **实战练习**
- **🤔 还不明白?打个比方!**
- **✅ 终极总结**
🚗 汽车里程表模型(8位补码)
假设你有一辆老式汽车,它的里程表只有 3 位数(最大显示 999
,最小 000
)。
现在,我们用它来理解 8位补码(因为 8 位二进制的最大值是 255
,类似 999
)。
规则 1:正数就是正常数字
+5
→ 直接显示005
(二进制00000101
)+127
→ 显示127
(二进制01111111
)
规则 2:负数 = “从最大值倒着走”
- 比如
-5
:- 先找到
999
(最大值) - 然后往回走
5
步 →999 - 5 = 994
- 所以
-5
在里程表上显示994
(二进制11111011
)
- 先找到
关键点:
- 负数 = 最大值 + 1 - 绝对值
- 8 位二进制:
-5
=256 - 5 = 251
(二进制11111011
)
- 8 位二进制:
- 计算机用同样的方式存储负数!
🔢 补码的运算:减法变加法
例子:计算 7 - 5
- 找到
-5
的补码:-5
=256 - 5 = 251
(二进制11111011
)
- 计算
7 + (-5)
:-
7
=00000111
-
-5
=11111011
-
相加:
00000111 (7) + 11111011 (-5) ------------ 100000010 (2)
-
丢弃第9位(就像里程表超过
999
会归零),剩下00000010
(2
)→ 结果正确!
-
❓ 为什么补码这么设计?
1. 减法变加法(CPU 省事!)
- 计算机最怕减法,但加法很容易。
- 补码让
A - B
变成A + (-B)
,CPU 只要一个加法器就能搞定所有运算!
2. 零只有一种表示(不浪费!)
- 原码有
+0
(00000000
)和-0
(10000000
),但补码只有00000000
。 -
-0
的补码还是00000000
,不会混淆!
3. 溢出自动处理(像钟表一样循环)
- 比如
127 + 1
:01111111 (127) + 1 = 10000000 (-128)
- 就像钟表从
12:59
跳到1:00
,很自然!
🎯 补码速记口诀
“正数直接存,负数取反加1,减法变加法!”
实战练习
-
-3
的 8 位补码是多少?- 先写
+3
:00000011
- 取反:
11111100
- 加1:
11111101
(这就是-3
的补码!)
- 先写
-
计算
10 - 3
(用补码)-
10
=00001010
-
-3
=11111101
-
相加:
00001010 (10) +11111101 (-3) ------------ 100000111 (7)
-
丢弃第9位 →
00000111
(7
),结果正确!
-
🤔 还不明白?打个比方!
想象你在玩 《超级马里奥》,屏幕最右边是 255
,最左边是 0
:
- 正数:马里奥向右走(
0 → 1 → 2 → ... → 127
) - 负数:马里奥向左走(
-1
=255
,-2
=254
,…,-128
=128
) - 如果走到尽头(比如
127 + 1
),就会从-128
重新开始!
补码的本质就是:用“绕圈”的方式表示负数!
✅ 终极总结
问题 | 补码的解决方案 | 例子(8位) |
---|---|---|
怎么存负数? | 取反加1 | -5 = ~5 + 1 = 11111011 |
怎么算减法? | 用加法代替 | 7 - 5 = 7 + 251 = 2 |
零有几个? | 唯一一个 | 00000000 |
溢出怎么办? | 自动循环 | 127 + 1 = -128 |
现在你懂了吗?如果还有问题,直接问我! 😊