CSDN 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012959829/article/details/38704077
例1:
public class test {
public static void main(String[] args) {
byte a = 127 ;
a = (byte)(a+3) ;
System.out.println(a);
}
}
输出-126,为什么呢
byte类型的取值范围是-128-127
这个输出结果是由java编码方式决定的,Java中正数用原码表示,负数用补码表示,第一位是符号位。
对于127他的编码是:
0000 0000 0000 0000 0000 0000 0111 1111
加上3也就是130,他的编码是:
0000 0000 0000 0000 0000 0000 1000 0010
使用强制转型后,a的编码就变成:
1000 0010
因为java第一位为1的为负数,负数用补码表示,所以要显示原码,要取反加1:
这样就变成 0111 1110
这样就是126加上符号,结果就是-126
例2:
public class test {
public static void main(String[] args) {
short a = 128 ;
byte b = (byte)a ;
System.out.println(b);
}
}
输出-128,为什么呢
同上:
a的编码是:
0000 0000 1000 0000
强制转型后变为1000 0000
因为java第一位为1的为负数,负数用补码表示,所以要显示原码,要取反加1:
还是1000 0000
这样就是128加上符号,结果就是-128
例3:
public class test {
public static void main(String[] args) {
byte a = (byte)(-129) ;
System.out.println(a);
}
}
输出127,为什么呢
同上:
a的补码是:
1000 0000 0000 0000 0000 0000 1000 0001
a的原码是:
0111 1111 1111 1111 1111 1111 0111 1111
强制转换,取后面8个字节,也就是
0111 1111
所以结果是127
转载自作者:Benjamin_whx
然后我有补充。。我觉得我转载的例3有问题。-129的补码应该是1111 1111 1111 1111 1111 1111 0111 1111.-129的原码应该是0000 0000 0000 0000 0000 0000 1000 0001.尤其是强制转换时,上面的例3说取后面8个字节,他取的是原码的后面的低8位,这很可能是错误的,因为Java中负数的存储是用补码来存储的,也就是强制转换时,会取-129的补码的低8位,按照我说的就是取的0111 1111,虽然我的想法和他的想法最后得到的结果都是127.但是这个过程,我觉得我的是正确的。虽然我也没有足够的证据证明我的想法。