天天看点

byte类型取值范围以及溢出详解

例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:

        short a = 128 ;  

        byte b = (byte)a ;  

        system.out.println(b);  

输出-128,为什么呢

同上:

a的编码是:

0000 0000 1000 0000

强制转型后变为1000 0000

还是1000 0000

这样就是128加上符号,结果就是-128

例3:

        byte a = (byte)(-129) ;  

输出127,为什么呢

a的补码是:

1000 0000 0000 0000 0000 0000 1000 0001

a的原码是:

0111 1111 1111 1111 1111 1111 0111 1111

强制转换,取后面8个字节,也就是

0111 1111

所以结果是127