请看一道面试题
public class Test2 {
public void add(Byte b) {
b = b++;
}
public void test() {
Byte a = 127;
Byte b = 127;
add(++a);
System.out.println("a = "+a);
add(b);
System.out.println("b = "+b);
}
public static void main(String[] args) {
Test2 test2=new Test2();
test2.test();
}
}
运行结果为:
a = -128
b = 127
为何呢?
<mark>分析:</mark>
首先看b,Byte b = 127; add(b) ,Byte属于包装类的值传递,并不会引起真实值的改变,可以看Java的值传递机制
再看a的值变化,++a表示的是a的参数先加1了再参与传参。
但是即使函数内部a的值怎么变化,a再传参前就已经加1了。
但是a+1 = 128吗,其实不然!
原因如下:
byte 的取值 -128 ~ 127
当 127 + 1 其实就已经越界了。但是在内存中时怎么处理呢?
十进制 | 二进制 |
---|---|
127 | 0111 1111 |
127 | +1 |
-128 | 1000 0000 |
因为在八位二进制的表示中:1000 0000的最高位符号位为1,是一个负数,故采用补码的形式,则对应的十进制就是-128。
如有出入恳请指教