这个java代码背后的逻辑是什么
我遇到了java线下面,并对其输出感到困惑。 你能解释一下这段代码背后的逻辑吗?
System.out.println((int)(char)(byte) -1);
输出:
65535
嗯,这相当于:
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'
这些帮助有用?
它是一样的
System.out.println((int) '?');
-
(byte) -1
给出:-1 -
(char) -1
给出:? -
(int) '?'
给出了65535
在java中, byte
是一个带符号(二进制补码)的8位基本类型。 值为-1的byte
的二进制表示是11111111
。 然后将其转换为char,这是一个16位原语,其值介于\u0000
和\uFFFF
(0和65535)之间 – 看起来该字节的位左移8,带符号扩展。 所以在这一点上二进制表示是:
1111111111111111
…或65535.然而,它不是那么简单,因为“哦,是的,然后它变成了一个int
所以我们看不到字符表示并打印出来”。 在java中,所有数字基元都已签名! 如果我们将char转换为另一个16位原语的short
,则程序将输出-1
。 但是,当我们将它转换为32位int
。 最终的二进制表示变为:
00000000000000001111111111111111
…这是签名和未签名的65535!