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' = ث