Java整数运算基于补码表示、固定字节分配和栈内直接存储;byte/short/int/long仅字节大小与范围不同;需警惕溢出不报错、字面量默认int、混合运算自动提升三大陷阱。

Java 整数运算不是简单加减,背后是补码表示、固定字节分配和栈内直接存储共同作用的结果。理解这些原理,才能避开溢出、类型转换异常、隐式提升陷阱等常见问题。
整数在内存中怎么存:补码是关键
Java 所有整数类型(byte、short、int、long)都用二进制补码形式存储,而非原码或反码。这解决了两个核心问题:统一零的表示(+0 和 -0 都是 0),以及让减法可转为加法(硬件实现更高效)。
- 正数补码 = 原码本身(如 byte 中 5 是
00000101) - 负数补码 = 先取绝对值原码 → 按位取反 → 再加 1(如 byte 中 -5:
00000101→11111010→11111011) - 最高位是符号位:0 表示正,1 表示负;因此 byte 范围是 -128(
10000000)到 127(01111111)
四种整数类型的本质区别:字节大小决定一切
它们之间没有“高级”或“低级”之分,只有内存占用和取值范围的差异。选择依据始终是:能否覆盖业务所需数值 + 是否节省资源。
-
byte(1 字节):-128 ~ 127。适合网络/IO 字节流、状态码、枚举序号(如
byte status = 1;表示“处理中”) - short(2 字节):-32768 ~ 32767。极少用于业务逻辑,多见于兼容旧协议或传感器 16 位原始数据
- int(4 字节):-2147483648 ~ 2147483647。默认整数类型,适用于计数、索引、ID(非超长)、时间戳秒数等绝大多数场景
-
long(8 字节):-9223372036854775808 ~ 9223372036854775807。必须加
L或l后缀(如1234567890123L),用于订单号、毫秒级时间戳、大数据量统计等
整数运算中的三大典型陷阱与应对
看似安全的算术操作,常因底层机制引发静默错误。
立即学习“Java免费学习笔记(深入)”;
-
溢出不报错:Java 整数运算是模运算。例如
int i = Integer.MAX_VALUE; i++;结果不是报错,而是变成Integer.MIN_VALUE(-2147483648)。解决办法:使用Math.addExact()、Math.multiplyExact()等方法,溢出时抛ArithmeticException -
字面量默认是 int:写
short s = 30000;编译失败,因为30000是int类型,超出short范围。正确写法是short s = (short) 30000;(强制转换,需确保值在范围内)或short s = 30000;(仅当值 ≤ 32767 且编译器能推断时才允许) -
混合运算自动提升:
byte a = 10; byte b = 20; byte c = (byte)(a + b);—— 必须强转!因为a + b运算时,两个byte会先提升为int,结果是int类型,不能直接赋给byte
整数变量存在哪:栈中存值,不是地址
所有基本类型变量(包括整数)的值都直接存储在栈内存中,而不是像对象那样存引用地址。这意味着:
- 访问极快,无间接寻址开销
- 作用域结束,变量立即销毁,内存自动回收
- 方法传参是值传递:修改形参不会影响实参原始值(例如传
int x进方法,方法内改x,原变量不变)


















