publicclassMulticast{ publicstaticvoidmain (String[] args){ System.out.println((int)(char)(byte) -1); } }
本来期望的结果为 -1,但调试结果返回 65535。
为什么会这样呢?
发现问题
小白知道,类型转换从小到大一般是不会丢失精度的,但这次的值发生了改变。
为了调试方便,小白将程序细分了好几步:
publicstaticvoidmain (String[] args){ inti=-1; byteb=(byte)i; //1charc=(char)b; //2intr=(int)c; //3System.out.println(r); }
第一步:int 转 byte
byte b=-1
第二步:byte 转 char
char c=65535
第三步:char 转 int
int r=65535
那么到底是什么原因导致 byte 转 char 的时候出现问题呢?小白一筹莫展。
扫地僧救场
扫地僧恰巧经过,扫了一眼,小声的说:“因为 byte 是一个有符号类型,而 char 是一个无符号类型。在将一个整数类型转换成另一个宽度更宽的整数类型时,通常是可以保持其数值的,但是却不可能将一个负的 byte 数值表示成一个 char。因此,从 byte 到 char 的转换被认为不是一个拓宽原始类型的转换,而是一个拓宽并窄化原始类型的转换:byte 被转换成了 int,而这个 int 又被转换成了 char”。
扫地僧看小白很是恭敬,也比较勤奋,就拿出笔画了步骤:
1.-1 是 int 类型,它的二进制结构
0b1111_1111_1111__1111_1111_1111_1111_1111
int 转成 byte,截取低 8 位 0b1111_1111 值也为 -1
2.byte 转 char,需要先拓展到 int 型,然后转成 char
2.1 byte 转 int
0b1111_1111_1111__1111_1111_1111_1111_1111
2.2 int 转 char
0b1111_1111_1111__1111
值位 65535
3.char 转 int (补零)
0b0000_0000_0000__0000_1111_1111_1111_1111
其值位 65535
