好的,这是一个专门针对“原码、反码、补码”的教学模块,完全为小学生设计,并紧密结合C++的实际表现。
一、 我们的敌人:负数!
电脑只认识0和1,那怎么表示-8、-100这样的负数呢?三位英雄前来挑战!
补码只针对有符号整数(unsigned int, float, doubleb不受影响)
第一位英雄:原码(最直接的办法)
- 规则: 用最左边的“信号灯”来表示正负。
0=正,1=负。 - 例子 (用4个灯泡):
+3->0011-3->1011
- 致命BUG:
- 有两个“0”:
+0 (0000)和-0 (1000)。 - 加法会出错:
1 + (-1)算出来是-2!
- 有两个“0”:
- 结果: 挑战失败! ❌
第二位英雄:反码(聪明的反转)
- 规则: 负数,就是把它对应的正数(除了信号灯)每一位都反过来。
- 例子 (用4个灯泡):
-3-> 正数3是0011-> 信号灯1不变,后面反转011->1100。
- 致命BUG:
- 还是有两个“0”:
+0 (0000)和-0 (1111)。
- 还是有两个“0”:
- 结果: 挑战失败! ❌
第三位英雄:补码(真正的救世主!)
- 规则: 负数,等于它的反码 + 1。
- 例子 (用4个灯泡):
-3-> 正数3是0011-> 反码是1100-> 再加1 ->1101。
- 神奇之处:
- 只有一个“0”:
0000。 - 加法完全正确:
3 + (-3)->0011 + 1101 = 10000-> 溢出丢掉 ->0000(是0!)
- 只有一个“0”:
- 结果: 挑战成功! ✅
记住: 现在的电脑里,所有有符号整数都是用 补码 来存储的!加法器只会加法,减法就相当于加一个负数。
补码的终极奥义:魔术时钟
为什么补码这么神奇?想象一个只能显示0-15的魔术时钟。
要从3点到1点,你可以:
- 后退 2 步 (
-2) - 前进 14 步 (
+14)
在这个时钟里, -2 和 +14 效果一样!
而14的二进制1110,正是-2的4位补码!
补码把减法巧妙地变成了加法!
二、 C++中的补码魔法 ~
~ 运算符(按位取反)会把一个数在内存中的补码每一位都反过来。
探险任务:~5 的结果为什么是 -6?
#include <iostream>
int main() {
int x = 5;
std::cout << "~x = " << ~x << std::endl; // 输出会是 -6
return 0;
}解密过程:
5的补码(我们只看8位):00000101~5按位取反后:11111010- 电脑看到
11111010,发现最高位是1,知道这是个负数的补码。 - 为了告诉我们它是谁,电脑要把它翻译回来:
- 步骤一(减1):
11111010 - 1 = 11111001 - 步骤二(取反):
00000110(这是 6) - 因为原来是负数,所以最终结果是 -6。
- 步骤一(减1):
神奇规律: 对于任何整数
x,~x的结果等于-(x + 1)。
三、 你的任务,小魔法师!
-
动动笔:
- 计算
-7的8位补码是多少? - 一个8位补码是
11110000,它代表的十进制数是多少?
- 计算
-
敲敲代码:
- 在C++中,验证
~7是不是等于-8。 - 在C++中,验证
~0是不是等于-1。 ~(-1)的结果是多少呢?自己动手试试看!
- 在C++中,验证