byte取值范围是-128到127,因8位补码共256种状态,符号位为0时正数最大为01111111(127),符号位为1时最小负数特例定义为10000000(-128),实现完整覆盖与溢出回卷。

一个 byte 类型占 8 位(bit),在有符号整数表示中采用**二进制补码(Two's Complement)** 编码,因此取值范围是 $-128$ 到 $127$。
为什么是 8 位?
byte 是 Java、C#、C 等语言中最小的有符号整数类型,硬件层面通常对应一个字节(8 bit)。这 8 个二进制位能表示 $2^8 = 256$ 个不同状态。补码编码用这 256 种状态均匀分配给负数、零和正数。
补码如何表示负数?
补码规则:
- 非负数(0 到 127):直接用原码,最高位(第 7 位,从 0 开始计)为 0,其余 7 位表示大小
- 负数(−128 到 −1):先写出对应正数的原码,再按位取反(0→1,1→0),最后加 1
例如:
−1 的补码:1 的原码是 00000001 → 取反得 11111110 → 加 1 得 11111111
−128 的补码:是特例,直接为 10000000(因为 +128 无法表示,补码将该模式定义为 −128)
为什么上限是 127 而不是 128?
最高位是符号位:0 表示非负,1 表示负。
当符号位为 0 时,剩下 7 位最多表示 $2^7 - 1 = 127$(即 01111111);
当符号位为 1 时,最小负数不是 −127,而是 −128 —— 因为补码把 10000000 单独定义为 −128,这样能多表示一个负数,实现对称覆盖(−128 ~ +127 共 256 个数)。
溢出怎么处理?
超出范围会“绕回”(wrap around):127 + 1 → 补码 01111111 + 1 = 10000000 → 解释为 −128−128 − 1 → 10000000 − 1 = 01111111 → 解释为 127
这是补码的自然行为,也是 CPU 加法器统一处理加减法的基础。

















