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,我想知道这个数字来自我的代码。救命啊!
答案 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));
答案 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中的字符大小)的每个倍数都被丢弃,只剩下剩下的显示。