在牛客上遇见一道java :
public class Test { public void add(Byte b) { b=b++; } public void test() { Byte a=127; Byte b=127; add(++a); System.out.PRintln(a+""); add(b); System.out.println(b); } ,原题判断输出情况:byte范围:-128~127;
执行++a时候,a会上溢变为-128,
传入add()函数时候,引用,原本会改变其值,在执行b=b++;时候。为基本值,退出函数时不会改变Byte型的值。
nailperry上传的反编译字节码:
// 源代码 public static void main(String[] args) { Byte a = 127; ++a; } // 字节码 public static void main(java.lang.String[]); Code: 0: bipush 127 // 将一个byte型常量值推送至操作数栈栈顶 2: invokestatic #2 // 自动装箱:访问栈顶元素,作为函数实参传入静态方法Byte.valueOf(byte), // 返回value值为127的Byte对象的地址,并压栈 5: astore_1 // 将栈顶数值赋值给局部变量表中下标为1的引用型局部变量a,栈顶数值出栈。此时a对应的byte值为127。 6: aload_1 // 局部变量表中下标为1的引用型局部变量a进栈 7: invokevirtual #3 // 自动拆箱,访问栈顶元素a,调用实例方法a.byteValue获取a所指Byte // 对象的value值,并压栈 10: iconst_1 // int型常量值1进栈 11: iadd // 依次弹出栈顶两int型数值1(0000 0001)、127(0111 1111) //(byte类型自动转型为int类型)相加,并将结果128(1000 0000)进栈 12: i2b // 栈顶int值128(1000 0000)出栈,强转成byte值-128(1000 0000),并且结果进栈 13: invokestatic #2 // 自动装箱:访问栈顶元素,作为函数实参传入静态方法Byte.valueOf(byte), // 返回value值为-128的Byte对象的地址,并压栈 16: astore_1 // 将栈顶数值赋值给局部变量表中下标为1的引用型局部变量a,栈顶数值出栈。此时a对应的byte值为-128。 17: return }
新闻热点
疑难解答