任何人都可以告诉我为什么这个显式转换会产生不同的结果,即使short / char的大小都是16位?
package jh;
public class Main {
public static void main(String[] args) {
byte b = (byte)255;
System.out.println("Size of short: " + Short.SIZE);
System.out.println("Size of char: " + Character.SIZE);
System.out.println((int)((short)b));
System.out.println((int)((char)b));
}
}
输出:
Size of short: 16
Size of char: 16
-1
65535
答案 0 :(得分:3)
byte:字节数据类型是一个8位带符号的二进制补码整数。它的最小值 -128,最大值127(含)。字节数据类型可用于在大型阵列中保存内存,其中节省的内存实际上很重要。它们也可用于代替int,其限制有助于澄清您的代码;变量范围有限的事实可以作为一种文档形式。
短:短数据类型是一个16位带符号的二进制补码整数。它的最小值 -32,768,最大值为32,767(含)。与字节一样,相同的准则也适用:在内存节省实际上很重要的情况下,您可以使用short来节省大型阵列中的内存。
char: char数据类型是一个16位Unicode字符。它的最小值为'\ u0000'(或0),最大值为'\ uffff'(或65,535(含))。
所以在短(原谅双关语),按位,它们是相同的。但char
表示与short
相同的位模式的数值。
这也伴随着符号扩展功能:(byte) 255
意味着一个字节值,所有位都设置为0b11111111
,在twos complement中为-1。向上转换时,Java执行符号扩展操作,因此如果符号位为0,则所有较高位也为0,但当符号位为1时,所有较高位也为1。这意味着-1表示所有已签名的整数数据类型中的-1(在此示例中为0b1111111111111111
的{{1}})。但不是char - 当所有位都设置时,等于正的最大值 - 65535。
答案 1 :(得分:3)
byte
已签名且仅包含值-128..127
。分配255时,它会回绕并变为-1
。
(short)b
是-1
。
char
但是Java中唯一的无符号类型,它的值为0..65535
,因此(char)-1
再次回绕并变为65535
。
答案 2 :(得分:0)
byte b = (byte)255;
这会将值{-1}分配给b
,因为byte
已签名。当你将-1转换为short
时,你得到-1。当你将-1转换为char
时,得到65535,因为char
的范围介于0到65535之间