一、核心概念:原码、反码、补码(以 8 位二进制为例)
三者均针对“带符号数”(最高位为符号位:0 表示正数,1 表示负数),仅负数的编码规则不同,正数的原/反/补码完全一致。
编码类型 正数(以 +3 为例) 负数(以 -3 为例) 规则说明
原码 0000 0011 1000 0011 符号位 + 数值的绝对值二进制
反码 0000 0011 1111 1100 正数不变;负数符号位不变,数值位按位取反
补码 0000 0011 1111 1101 正数不变;负数 = 反码 + 1(解决原码“正负相加不为0”的问题)
二、Java 验证程序:通过位运算观察补码特性
通过 Integer.toBinaryString() 可获取整数的 32 位补码(高位省略前导 0,负数显示完整符号位),结合位运算验证补码规则。
public class BinaryCodeTest {
public static void main(String[] args) {
// 1. 验证正数:原/反/补码一致
int positive = 3;
System.out.println("1. 正数 +3 的验证:");
System.out.println("十进制值:" + positive);
// toBinaryString 输出补码,正数无符号位问题,直接对应数值
System.out.println("32位补码(省略前导0):" + Integer.toBinaryString(positive)); // 输出 11
System.out.println("------------------------");
// 2. 验证负数:补码 = 反码 + 1(通过“负数 = 正数按位取反 + 1”验证)int negative = -3;System.out.println("2. 负数 -3 的验证:");System.out.println("十进制值:" + negative);System.out.println("32位补码:" + Integer.toBinaryString(negative)); // 输出 11111111111111111111111111111101(32位,符号位1,数值位为补码)// 验证补码规则:-3 = ~3 + 1(~为按位取反,正数取反后为负数的反码)int notPositive = ~positive; // ~3 = -4(二进制:11111111111111111111111111111100,即-3的反码)int negativeFromComplement = notPositive + 1; // 反码 +1 = 补码,结果为 -3System.out.println("验证:~3(反码) = " + notPositive); // 输出 -4System.out.println("验证:~3 + 1(补码) = " + negativeFromComplement); // 输出 -3System.out.println("------------------------");// 3. 验证补码的核心优势:正负相加为 0(解决原码的缺陷)int sum = positive + negative;System.out.println("3. 补码优势验证:");System.out.println("3 + (-3) = " + sum); // 输出 0(若用原码计算会得到 10000010,即-2,显然错误)System.out.println("0 的32位补码:" + Integer.toBinaryString(sum)); // 输出 0
}
}
三、运行结果与结论
1. 正数(如 +3)的二进制输出为 11,与原/反/补码一致,无符号位冲突。2. 负数(如 -3)的二进制输出为 32 位的 11111111111111111111111111111101,完全符合“补码 = 反码 + 1”的规则。3. 正负相加(3 + (-3))结果为 0,验证了补码解决“原码运算错误”的核心作用。
综上,Java 中整数的存储和运算均基于补码,这是计算机解决负数运算问题的标准方案。