java中byte以8位补码直接存储,正数0~127存原值,负数-1~-128存对应补码;符号位是权重-128位,范围-128~127由256种编码均匀分配。

byte 类型在 Java 中以 8 位补码形式存储,不是“先存原码再转换”,而是直接写入补码——这是硬件和 JVM 的统一约定,也是所有运算能正确进行的基础。
补码是唯一真实存储形式
内存里没有原码、反码的影子。JVM 写入 byte 变量时:
- 正数(0~127):二进制就是它本身,比如 5 → 00000101
- 负数(-1~-128):直接计算并存入补码,比如 -5 → 11111011(不是先写 10000101 再翻转加 1,而是结果直接是 11111011)
- System.out.println() 输出的是还原后的十进制值,不是内存里的二进制串
符号位不是标签,是权重位
最高位(bit7)不单表示正负,它代表 -128 这个数值权重。整个 8 位被解释为:
-128×b₇ + 64×b₆ + 32×b₅ + 16×b₄ + 8×b₃ + 4×b₂ + 2×b₁ + 1×b₀
- 10000000 = -128 + 0 + … + 0 = -128
- 11001000 = -128 + 64 + 0 + 0 + 8 + 0 + 0 + 0 = -56(即 (byte)200 的结果)
- 11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
为什么最小值是 -128 而不是 -127
8 位共 256 种组合(00000000 到 11111111),补码体系必须全部用满:
- 0~127 占用 128 个编码(00000000 到 01111111)
- 剩下 128 个自然分配给负数:10000000 到 11111111 → 对应 -128 到 -1
- 10000000 没有对应原码,它是补码规则下人为指定的边界值,保证了加减运算闭合(如 -127 - 1 = -128)
观察补码的实用技巧
避免符号扩展干扰,看清真实字节:
- 用 Integer.toBinaryString(b & 0xFF) 获取 8 位无符号二进制(如 -1 → "11111111")
- 用 Integer.toHexString(b & 0xFF) 看十六进制(如 -128 → "80",-1 → "ff")
- (byte)129 → 截断低 8 位得 10000001 → 十六进制 0x81 → 解读为 -127











