为什么我得到这个结果?

时间:2016-10-18 14:50:59

标签: java

char ch = '3';
result = cube(ch);
// Call the method that accepts a char
System.out.println("Cubed 'char' = " + result);

方法cube

private static char cube(char c) {
    char result;
    result = (char) (c *c *c);
    return result;
}

当我运行此代码时,我得到了立方体' char' = 1579,我想知道这个数字来自我的代码。救命啊!

3 个答案:

答案 0 :(得分:8)

当您char多个int时,they are promoted to int

'3'的{​​{1}}值为51(ASCII值;如JLS Sec 3.1中所述,UTF-16编码的前128个字符与ASCII字符相同。)< / p>

所以'3' * '3' * '3' == 51 * 51 * 51 == 132651

132651太大而无法在投射时加入char;所以它溢出(两次,因为Character.MAX_VALUE == 65535),你得到值

   (char) (c * c * c)
== (char) 132651
== (char) (132651 % 65536)
== (char) 1579
== 'ث'

但是,您要将cube的调用结果分配给名为int的{​​{1}}(或long)变量;所以它再次被提升result,然后连接到字符串:这意味着整数值被附加到字符串,而不是int。因此:

char

在输出中。

请注意,如果您在未指定Cubed 'char' = 1579 的情况下致电:

result

然后输出

System.out.println("Cubed 'char' = " + cube(ch));

Ideone demo

答案 1 :(得分:2)

Java中的char是16位无符号类型,范围为0到65535.

您的代码char ch = '3';实际上是将值51分配给ch。 (Java要求char类型的前7位使用ASCII,而51是数字3的ASCII值。

正式的乘法发生在多次转换的参数转换为int之后。结果,51 * 51 * 51是132651并且是int类型。将此值分配给char时,Java将减去所需的65536个值,以将结果拉入可接受的范围。所以你的答案是

51 * 51 * 51 - 65536 - 65536,即1579

答案 2 :(得分:1)

该数字是:(51 ^ 3)%(2 ^ 16)

的结果

因为正如andy在评论中所说,51(ascii值为&#39; 3&#39;)^ 3溢出,所以2 ^ 16(java中的字符大小)的每个倍数都被丢弃,只剩下剩下的显示。