Java 原码、反码、补码
原码
什么是原码,怎么知道原码?
还记得前面数据类型那一章里有一张图片吗

比如十进制的 5
byte b_num = 5;
short s_num = 5;
int i_number = 5;
这就是上面三种类型,对应的原码。

原码就是将数字转换成对应的二进制,再将前面剩余的所有空间用 0 填充
什么是符号位
符号就是二进制的第一位如下图

符号位是 0 代表正数
符号位是 1 代表负数
所以,正数的原码是他本身的对应的二进制
负数的原码是他本身的对应的二进制,但符号位是 1
反码
什么是反码
首先,反码分两种情况
- 正数:正数的反码就是正数的原码(也就是正数本身对应的二进制)
- 负数:负数的反码是它的原码符号位不变其他位取反(即0 -> 1 1 -> 0)
如 -5 的反码

什么是补码
补码也是分两种情况
- 正数:正数的补码还是正数本身
- 负数:负数的补码就是它的反码
+1[这里需要注意 将负数的反码转成补码的时候是反码+1将负数的补码转成反码是补码-1]
如 -5 的反码:
需要先得到 -5 的 原码 ,再将 原码 转成 反码 ,最后再将 反码 转成 补码
负数补码 获取顺序 = 原码 ==> 反码 ==> 补码
如下图:

反码、补码的作用
反码解决负数加法运算问题,将减法运算转换为加法运算,从而简化运算规则;补码是用于计算机内部运算的(即:计算机都是以补码的方式来运算的)了解:解决负数加法运算正负零问题,弥补了反码的不足
计算机对位运算的过程
- 计算机会先把
原码转换成反码 - 再将
反码转成补码 - 然后再以
补码进行运算 - 运算完成后再将
补码转换成反码 - 再将
反码转换成原码
这里 源码 => 补码,和 补码 => 原码 的顺序是刚好倒过来的
原码=>补码原码=>反码=>补码(需要注意的是反码转补码是反码+1,如果这个不清楚先别往下看,回去看上面 什么是补码)
补码=>原码补码=>反码=>原码(需要注意的是补码转反码是补码-1)
总结
- 二进制的最高位是符号位:
0代表正数、1代表负数。 - 正数的
原码、反码、补码都是它本身。 - 负数的
原码是数字本身对应的二进制,但是符号位是1。 - 负数的
反码是原码的符号位不变,其他位反转(即0=>1 1=>0)。 - 负数的
补码是反码+1 0的反码、补码都是0- Java 中所有的数字都是有符号的
- 在计算机运算时,都是以
补码的方式来运算的 - 要看实际运算结果,需要看
原码

浙公网安备 33010602011771号