Java语法 - 强制转换后的额外加号是有效的吗?

时间:2014-10-09 11:34:00

标签: java syntax casting

因此,当我将byte转换为char时,我遇到了一些困扰我的事情,通常我会这样做:

for (byte b:"ABCDE".getBytes()) {
    System.out.println((char)b);
}

将打印出来

A
B
C
D
E

我不小心在+(char)之间留下了b,并获得了相同的结果!?

像这样:

for (byte b:"ABCDE".getBytes()) {
    System.out.println((char) + b);
}

为什么会发生这种情况?

我基本上在做(char)(0x00 + b)吗?因为

System.out.println((char) - b);

产生不同的结果。

注意:使用Java版本1.8.0_20

3 个答案:

答案 0 :(得分:26)

  

为什么会发生这种情况?

如果你在一个数字或表达式之前放置一元-运算符,它就会否定它。

同样,如果你在一个数字或表达式之前放置一元+运算符,它什么都不做。

将字节转换为char的更安全的方法是

char ch = (char)(b & 0xFF);

这适用于0到255之间的字符,而不是0到127。

顺便说一句,你可以使用一元运算符编写一些令人困惑的代码,如

int i = (int) + (long) - (char) + (byte) 1; // i = -1;

答案 1 :(得分:7)

b是一个字节,也表示为+ b。例如,3也可以写为+3。因此,((char)+ b)与((char)b)

相同

答案 2 :(得分:5)

+是一元加号运算符 - 就像您可以说1相当于+1b相当于+b+b之间的空格无关紧要。此运算符的优先级高于强制转换,因此在应用之后(如上所述,不执行任何操作),生成的byte将转换为char并生成与之前相同的结果。