Java 为什么我会得到这个结果?

Java 为什么我会得到这个结果?,java,Java,方法cube char ch = '3'; result = cube(ch); // Call the method that accepts a char System.out.println("Cubed 'char' = " + result); 当我运行这段代码时,我得到了“char”的立方=1579,我想知道这个数字在我的代码中来自哪里。救命啊 这个数字是:(51^3)%(2^16)的结果 因为,正如andy在一篇评论中所说,51(ascii值为'3')^3溢出,所以2^16(ja

方法
cube

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

当我运行这段代码时,我得到了“char”的立方=1579,我想知道这个数字在我的代码中来自哪里。救命啊

这个数字是:(51^3)%(2^16)的结果


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

当您同时使用多个
字符时

'3'
int
值为51(ASCII值;如中所述,UTF-16编码的前128个字符与ASCII字符相同)

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

但是
132651
太大,当您将其转换为
char
时,它无法容纳;因此它会溢出(两次,因为
Character.MAX_VALUE==65535
),然后您会得到该值

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

   (char) (c * c * c)
== (char) 132651
== (char) (132651 % 65536)
== (char) 1579
== 'ث'
在输出中

请注意,如果调用时未指定
结果

Cubed 'char' = 1579
然后输出为

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

Java中的char
是一种16位无符号类型,范围从0到65535

你的代码
charch='3'
实际上是将值51赋给
ch
。(Java要求字符类型的前7位使用ASCII,51是数字3的ASCII值)

在形式上,乘法发生在多应用程序的参数转换为
int
之后。结果51*51*51是132651,是
int
类型。当您将其分配给
char
时,Java将根据需要减去65536个值,以将结果拉入可接受的范围。所以你的答案是


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

'3'==51
51^3==132651
,大于
字符。最大值
;所以它溢出了。不,它是在Java中定义的。看看相关的帖子。如果说“3”是十进制值为51的
char
(UTF-16代码单元)的文本值,不是更简单吗?虽然有些人可能熟悉术语“ASCII”,但ASCII中“3”的值与此无关。
Cubed 'char' = ث