当前位置: 首页 > news >正文

反码补码学习笔记

反码、补码与 Java byte 学习笔记

本笔记记录本次学习重点:二进制、原码、反码、补码、二进制加法、8 位补码、Java byte 溢出与 byte 运算规则。


一、先会看二进制

1. 4 位二进制的权重

4 位二进制从右往左,每一位分别代表:

8 4 2 1

例如:

0010

对齐看:

二进制:0 0 1 0
权重: 8 4 2 1

只有 2 这一位是 1,所以:

0010 = 2

再看几个:

0001 = 1
0010 = 2
0011 = 2 + 1 = 3
0100 = 4
0101 = 4 + 1 = 5
0110 = 4 + 2 = 6
0111 = 4 + 2 + 1 = 7

记忆方法:

看 1 在哪个位置,把对应权重加起来。

二、原码

原码是最符合人类直觉的表示方式。

规则:

最高位表示符号:
0 = 正数
1 = 负数

后面的位表示数值大小。

以 4 位为例:

0101 = +5
1101 = -5

拆开看:

0101 = 0 101 = +5
1101 = 1 101 = -5

三、反码

规则:

正数的反码 = 原码不变

负数的反码 = 符号位不变,后面取反

取反的意思:

0 变 1
1 变 0

例子:-5 的反码

-5 原码:1101

拆开:

1 101

符号位 1 不变,后面 101 取反:

101 -> 010

所以:

-5 反码:1010

常见例子

+3 原码:0011,反码:0011
-3 原码:1011,反码:1100

+5 原码:0101,反码:0101
-5 原码:1101,反码:1010

-1 原码:1001,反码:1110

四、补码

规则:

正数的补码 = 原码不变

负数的补码 = 反码 + 1

也可以记成:

负数补码 = 正数二进制取反 + 1

例子:-5 的 4 位补码

先写 +5

0101

取反:

1010

加 1:

  1010
+ 0001
------
1011

所以:

-5 的 4 位补码 = 1011

常见 4 位补码

+1 = 0001
-1 = 1111

+2 = 0010
-2 = 1110

+3 = 0011
-3 = 1101

+5 = 0101
-5 = 1011

+6 = 0110
-6 = 1010

+7 = 0111
-7 = 1001

五、二进制加法

二进制是:

满 2 进 1

基础规则:

0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10

重点:

1 + 1 = 10

意思是:

本位写 0,向前进 1

还有一个常见情况:

1 + 1 + 1 = 11

意思是:

本位写 1,向前进 1

六、为什么补码好用?

补码的核心作用:

让减法变成加法。

例如:

5 - 5

计算机可以看成:

5 + (-5)

用 4 位补码:

+5 = 0101
-5 = 1011

相加:

  0101
+ 1011
------
1 0000

因为只看 4 位,最前面多出来的 1 丢掉:

0000

所以结果是:

5 + (-5) = 0

再看:

+3 = 0011
-1 = 1111

相加:

  0011
+ 1111
------
1 0010

只保留 4 位:

0010

0010 = 2,所以:

3 + (-1) = 2

七、4 位补码表示范围

4 位补码一共可以表示 16 个数:

0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7

1000 = -8
1001 = -7
1010 = -6
1011 = -5
1100 = -4
1101 = -3
1110 = -2
1111 = -1

所以 4 位补码范围是:

-8 到 7

重点边界:

0111 = 7
1000 = -8
1111 = -1
0000 = 0

八、补码转十进制

判断规则:

最高位是 0:正数,直接算

最高位是 1:负数,取反 + 1,再加负号

例子 1:0010

0010

最高位是 0,直接算:

0010 = 2

例子 2:1011

1011

最高位是 1,说明是负数。

取反:

0100

加 1:

0101

0101 = 5

加负号:

1011 = -5

例子 3:1110

1110

取反:

0001

加 1:

0010

0010 = 2

所以:

1110 = -2

九、8 位补码

Java 里的 byte 就是 8 位补码。

8 位权重:

128 64 32 16 8 4 2 1

例如:

0000 1010

对齐:

二进制:0   0  0  0  1 0 1 0
权重:128 64 32 16 8 4 2 1

1 的位置是 82

0000 1010 = 8 + 2 = 10

十、8 位负数补码

例子:-5

先写 +5

0000 0101

取反:

1111 1010

加 1:

  1111 1010
+ 0000 0001
------------
1111 1011

所以:

-5 的 8 位补码 = 1111 1011

常见 8 位补码

-1  = 1111 1111
-2 = 1111 1110
-3 = 1111 1101
-5 = 1111 1011
-6 = 1111 1010
-10 = 1111 0110

十一、8 位补码转十进制

规则仍然是:

最高位是 0:正数,直接算

最高位是 1:负数,取反 + 1,再加负号

例子 1:1111 1011

1111 1011

最高位是 1,是负数。

取反:

0000 0100

加 1:

0000 0101

0000 0101 = 5

所以:

1111 1011 = -5

例子 2:1111 0110

1111 0110

取反:

0000 1001

加 1:

0000 1010

0000 1010 = 10

所以:

1111 0110 = -10

十二、Java byte 的范围

Java 中:

byte b;

byte 是 8 位补码。

8 位一共有 256 种组合:

0000 0000 到 1111 1111

其中:

0000 0000 到 0111 1111 表示 0 到 127
1000 0000 到 1111 1111 表示 -128 到 -1

所以 byte 范围是:

-128 到 127

几个关键值:

0000 0000 = 0
0111 1111 = 127
1000 0000 = -128
1111 1111 = -1
1000 0001 = -127

十三、byte 溢出

例子 1:127++

byte b = 127;
b++;
System.out.println(b);

结果:

-128

原因:

127 = 0111 1111

加 1:

  0111 1111
+ 0000 0001
------------
1000 0000

而:

1000 0000 = -128

所以:

127 + 1 = -128

例子 2:-128--

byte b = -128;
b--;
System.out.println(b);

结果:

127

原因:

-128 = 1000 0000

减 1 后绕回:

0111 1111 = 127

十四、Java 中 byte 运算会自动提升为 int

重点规则:

byte、short、char 参与运算时,会自动提升为 int。

所以:

byte a = 1;
byte b = 2;
byte c = a + b;

这段代码会编译报错。

原因:

a + b 的结果类型是 int
byte c 接不住 int

正确写法:

byte a = 1;
byte b = 2;
byte c = (byte)(a + b);

或者:

byte a = 1;
byte b = 2;
int c = a + b;

总结:

byte c = a + b;          // 错,a+b 是 int
int c = a + b; // 对
byte c = (byte)(a + b); // 对,强制转成 byte

十五、强转 byte 可能溢出

例如:

byte a = 100;
byte b = 100;
byte c = (byte)(a + b);
System.out.println(c);

先算:

100 + 100 = 200

但是 byte 范围是:

-128 到 127

200 超出了 byte 范围。

200 的 8 位二进制是:

1100 1000

最高位是 1,按 byte 补码解释是负数。

反推:

1100 1000
↓ 取反
0011 0111
↓ +1
0011 1000

0011 1000 = 32 + 16 + 8 = 56

所以:

1100 1000 = -56

因此:

byte c = (byte)(100 + 100);
System.out.println(c);

输出:

-56

注意区分:

int c = a + b;          // 结果是 200

byte c = (byte)(a + b); // 结果是 -56

十六、本次学习口诀

正数:
原码 = 反码 = 补码

负数:
原码:符号位为 1,后面是数值
反码:符号位不变,后面取反
补码:反码 + 1

更实用的记法:

负数补码 = 正数二进制取反 + 1

补码转十进制:

0 开头:直接算
1 开头:取反 + 1,再加负号

Java byte:

byte 是 8 位补码
范围是 -128 到 127
127 + 1 = -128
-128 - 1 = 127
byte、short、char 运算会提升为 int

十七、建议后续复习顺序

  1. 先练 4 位二进制正数:

    0010 = ?
    0101 = ?
    0111 = ?
  2. 再练 4 位负数补码:

    1111 = ?
    1110 = ?
    1011 = ?
  3. 再练十进制转补码:

    -1 = ?
    -2 = ?
    -5 = ?
  4. 再练 8 位 byte:

    1111 1111 = ?
    1111 1011 = ?
    1000 0000 = ?
    0111 1111 = ?
  5. 最后练 Java 代码:

    byte b = 127;
    b++;

    byte b = -128;
    b--;

    byte a = 100;
    byte b = 100;
    byte c = (byte)(a + b);

十八、最终掌握目标

学完这一部分,你应该能做到:

1. 会看二进制正数。
2. 知道原码、反码、补码的区别。
3. 会把负数转成补码。
4. 会把补码反推成十进制。
5. 会做简单二进制加法。
6. 理解 Java byte 为什么是 -128 到 127。
7. 理解 byte 溢出。
8. 知道 byte 运算为什么会自动提升成 int。
http://www.jsqmd.com/news/1039229/

相关文章:

  • 3分钟解决Windows 11臃肿问题:免费开源工具Win11Debloat终极指南
  • 嵌入式多路ADC高效采集:MC68336 QADC模块原理与实战指南
  • 嵌入式开发基础:SysDS Loader与Picobug监控程序实战解析
  • PHARL:基于物理感知的跌倒风险分析技术解析
  • ATM网络OAM机制深度解析:从AIS/RDI信元到硬件性能监控实战
  • LiveSplit:速通玩家的终极计时器,让每一秒都精准掌控 [特殊字符]⏱️
  • SLAM Toolbox终极教程:掌握ROS 2D SLAM的7个实战技巧与5大核心优势
  • 深入解析NXP MCU Bootloader与blhost工具:从原理到高级应用实践
  • NXP WCT无线充电库HAL函数实战解析:从核心原理到系统调优
  • ctfshow 无字母数字代码执行
  • EasyLPAC:5个关键步骤掌握专业级eUICC智能卡管理工具
  • 2026年宁波AI推广服务商实测盘点与合规推荐 - 起跑123
  • 医疗AI落地两大硬坎:临床信任断裂与数据合规失焦
  • AI公平性工程新范式:因果推断与合规落地实战
  • 终极指南:使用urdf-viz轻松实现机器人URDF文件可视化
  • 长途跨省电瓶车托运哪家好?2026最新口碑榜单 - 快递物流资讯
  • 股市语言密码:看懂全球资本流动的翻译之道
  • Adaboost原理深度解析:理解梯度提升家族的基石
  • 2026年现阶段贵州纠纷律师咨询哪位好?专业指南与资深律师马军深度解析 - 品牌鉴赏官2026
  • AI创业五大致命陷阱:从需求失焦到数据枯竭的实战避坑指南
  • Gemma 4 ARA越狱原理:线性表征与神经外科级模型编辑
  • 终极指南:如何为300+车型部署开源驾驶辅助系统openpilot
  • 3分钟搞定小爱音箱音乐服务:DID配置的终极完整指南 [特殊字符]
  • 2026在线去除背景工具保姆级教程!免费无水印AI在线抠图不用下载
  • 5个产品设计核心挑战与解决方案:构建现代数字产品设计技术栈
  • Microchip技术文档法律条款解读:工程师必知的知识产权、免责声明与风险规避
  • MCP6H系列运放:低功耗高精度CMOS运放的设计与应用实战
  • 嵌入式AEC算法库解析:从NLMS原理到DSP工程实践
  • 2026年文旅行业GEO优化公司“全意图”价值评估指南与选型避坑 - GEO优化
  • MATLAB单变量时序预测工具:内置KELM与SSA-KELM双模型,自动调参出图