Java强制类型转换时数值转换规则及临时运算内存管理问题
public class Try { public static void main(String[] args) { int num = (byte)129; System.out.println(num); // result is: -127 } }
问题1解答
你的说法在当前场景下是准确的:方法内声明的局部基本类型变量确实由栈空间存储,你例子中的num是main方法的局部变量,因此分配在栈上。
补充一个前提说明:如果基本类型是类的实例成员/静态成员,会跟随对象或类元数据存储在堆空间,只有方法作用域内的局部变量才会走栈分配。
问题2解答
你描述的整个转换过程完全正确,每一步都符合Java的语言规范:
- 字面量
129默认是int类型,占4字节,补码表示的二进制确实为00000000 00000000 00000000 10000001 - 执行
(byte)强制窄化转换时,Java对整数类型的窄化规则就是直接截断取低N位,这里取低8位得到10000001,byte是有符号类型,最高位为1代表负数,按补码规则计算真值就是-127 - 最后将byte类型的
-127赋值给int类型的num时,会自动执行有符号扩展,高位全部补符号位1,最终num存储的4字节二进制就是11111111 11111111 11111111 10000001,和你描述的完全一致。
内容的提问来源于stack exchange,提问作者Hodiya Eyal
相关产品推荐
相关产品推荐

