这个java代码背后的逻辑是什么

时间:2011-09-21 13:25:57

标签: java

我遇到了java line下面,并对其输出感到困惑。能否请您解释一下这段代码背后的逻辑

System.out.println((int)(char)(byte) -1);

输出:

65535

3 个答案:

答案 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)

我认为bytechar转换实际首先进行隐式扩展转换 - 所以它就像这样:

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!