我遇到了java line下面,并对其输出感到困惑。能否请您解释一下这段代码背后的逻辑
System.out.println((int)(char)(byte) -1);
输出:
65535
答案 0 :(得分:12)
嗯,这相当于:
byte b = -1;
char c = (char) b; // c = '\uFFFF' - overflow from -1
int i = c; // i = 65535
原来显式转换为int
只是为了让它调用System.out.println(int)
而不是System.out.println(char)
。
我认为byte
到char
转换实际首先进行隐式扩展转换 - 所以它就像这样:
byte b = -1;
int tmp = b; // tmp = -1
char c = (char) tmp; // c = '\uFFFF'
这有帮助吗?
答案 1 :(得分:5)
与
相同 System.out.println((int) '?');
(byte) -1
给出:-1 (char) -1
给出:?(int) '?'
给出65535 答案 2 :(得分:1)
在java中byte
是一个带符号(二进制补码)的8位基本类型。 byte
的二进制表示值为-1 11111111
。然后将其转换为char,这是一个16位原语,其值介于\u0000
和\uFFFF
之间(0和65535) - 看起来该字节的位被左移8 ,带符号扩展名。所以在这一点上二进制表示是:
1111111111111111
...或65535.然而,它并不像说&#34那么简单;哦,是的,然后它变成了int
,所以我们没有看到字符表示,是打印出来"。在java中,所有数字基元都已签名!如果我们将char转换为short
,这是另一个16位基元,程序将输出-1
。但是,当我们将其转换为32位int
时。最终的二进制表示形式为:
00000000000000001111111111111111
...这是签名和未签名的65535!