short a = 128, byte b = (byte)a 强制类型转换

 1 package 笔试;
 2 
 3 public class ShortToByte {
 4 
 5     /**
 6      * @param args
 7      */
 8     public static void main(String[] args) {
 9         // TODO Auto-generated method stub
10             short a=128;
11             byte b=(byte)a;
12             System.out.println("short强制类型转换为byte时,a="+a+","+b);
13             byte a1=(byte)128;
14             byte b1=(byte)(-129);
15             System.out.println("int强制类型转换为byte时,a1="+a1+",b1="+b1);
16     }
17 
18 }

执行结果为:short强制类型转换为byte时,a=128,-128
int强制类型转换为byte时,a1=-128,b1=127

跟计算机的数据表示格式有关:负数用补码表示。

byte类型的数据取值范围是:-128-127,
例如:byte a=(byte)128;
  byte b=(byte)(-129);
a和b得值分别为-128和127.
这个是Java编码方式决定的,Java中正数用源码表示,负数用补码表示,第一位是符号位。

所以对于128和-129,他们的编码分别是:
0000 0000 0000 0000 0000 0000 1000 0000
和1111 1111 1111 1111 1111 1111 0111 1111。
使用强制类型转换之后得到的a和b分别是1000 0000和0111 1111。
对于a来说,1000 0000是负数(第一位为1),它的绝对值是1000 0000即128,
而对于b来说,0111 1111是正数,值为127。 强制转换的截位本身就带来数据的损失,所以出来的结果比较怪也是正常。
原文地址:https://www.cnblogs.com/sara-gcj/p/3316648.html