java中byte、short、char参与算术运算时无条件提升为int,结果必为int;赋值需显式强转,复合赋值符(如+=)自动插入窄化转换;混合运算按类型等级链逐级提升。

Java里只要byte、short或char一参与算术运算,立刻变成int——不是“可能”,而是无条件、不可跳过的编译期规则。
它们从不直接运算
哪怕两个byte相加、一个char加一个short,Java也不会让它们用原类型算。底层会先统一转成int,再做加减乘除。
- byte b = 10; short s = 20; → b + s 实际是 (int)10 + (int)20,结果为int
- char c = 'A'; → c + 1 等价于 65 + 1,结果仍是int
- 所以 byte d = b + s; 编译失败:左边是byte,右边算出来是int,Java禁止隐式窄化
想存回去?必须显式处理
如果真要塞回小类型,得自己负责截断风险:
- byte d = (byte)(b + s); // 强转可行,但溢出时不报错,只取低8位
- char res = (char)(c + 1); // 同理,'z' + 1 得到 '\u0000'(因为溢出)
- 注意:char是无符号,short是有符号,强转时语义不同,但Java只管截位
复合赋值是例外
+=、-=、*= 等操作符被Java特殊照顾,自动插入窄化转换:
- byte b = 10; b += 1; → 合法,等价于 b = (byte)(b + 1)
- short s = 5; s *= 2; → 合法,自动转回short
- ++ 和 -- 也适用:byte b = 0; b++; 没问题
混合运算看“最高类型”
当byte/short/char和其他类型一起出现,提升分两步走:先全升int,再按浮点/长整规则继续升。
- byte + float → byte→int→float,结果是float
- short + long → short→long,结果是long
- char + double → char→int→double,结果是double
- 记住等级链:byte ≈ short ≈ char → int → long → float → double











