好的,这是一个专门针对“原码、反码、补码”的教学模块,完全为小学生设计,并紧密结合C++的实际表现。


一、 我们的敌人:负数!

电脑只认识01,那怎么表示-8-100这样的负数呢?三位英雄前来挑战!
补码只针对有符号整数(unsigned int, float, doubleb不受影响)

第一位英雄:原码(最直接的办法)

  • 规则: 用最左边的“信号灯”来表示正负。0=正,1=负。
  • 例子 (用4个灯泡):
    • +3 -> 0011
    • -3 -> 1011
  • 致命BUG:
    1. 有两个“0”+0 (0000)-0 (1000)
    2. 加法会出错1 + (-1) 算出来是 -2
  • 结果: 挑战失败!

第二位英雄:反码(聪明的反转)

  • 规则: 负数,就是把它对应的正数(除了信号灯)每一位都反过来
  • 例子 (用4个灯泡):
    • -3 -> 正数30011 -> 信号灯1不变,后面反转 011 -> 1100
  • 致命BUG:
    1. 还是有两个“0”+0 (0000)-0 (1111)
  • 结果: 挑战失败!

第三位英雄:补码(真正的救世主!)

  • 规则: 负数,等于它的反码 + 1
  • 例子 (用4个灯泡):
    • -3 -> 正数30011 -> 反码是1100 -> 再加1 -> 1101
  • 神奇之处:
    1. 只有一个“0”0000
    2. 加法完全正确3 + (-3) -> 0011 + 1101 = 10000 -> 溢出丢掉 -> 0000 (是0!)
  • 结果: 挑战成功!

    记住: 现在的电脑里,所有有符号整数都是用 补码 来存储的!加法器只会加法,减法就相当于加一个负数。


补码的终极奥义:魔术时钟

为什么补码这么神奇?想象一个只能显示0-15的魔术时钟。

要从3点到1点,你可以:

  1. 后退 2 步 (-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;
}

解密过程:

  1. 5 的补码(我们只看8位): 00000101
  2. ~5 按位取反后: 11111010
  3. 电脑看到 11111010,发现最高位是1,知道这是个负数的补码。
  4. 为了告诉我们它是谁,电脑要把它翻译回来:
    • 步骤一(减1): 11111010 - 1 = 11111001
    • 步骤二(取反): 00000110 (这是 6)
    • 因为原来是负数,所以最终结果是 -6

神奇规律: 对于任何整数 x~x 的结果等于 -(x + 1)

三、 你的任务,小魔法师!

  1. 动动笔:

    • 计算 -7 的8位补码是多少?
    • 一个8位补码是 11110000,它代表的十进制数是多少?
  2. 敲敲代码:

    • 在C++中,验证 ~7 是不是等于 -8
    • 在C++中,验证 ~0 是不是等于 -1
    • ~(-1) 的结果是多少呢?自己动手试试看!