我想知道以下代码行是如何工作的?
char c = (char) -98;
据我所知,所有签名的号码都以 2的补码形式存储。因此-98
将存储在 2的补充表单中。所以,如果你输入它成为char。这种类型的转换是如何由JVM完成的?
如果我错了,请纠正我。
答案 0 :(得分:7)
当你写:
char c = (char) -98;
就像写 1 :
一样 char c = 65438;
[因为65438 = 2^16 - 98
]
当明确将int
转换为char
时,将删除前16个位。
1 -98 in 2的补码是
11111111111111111111111110011110
。
char
的转换只保留16位:
1111111110011110
此值代表65438 ..
更多阅读:
答案 1 :(得分:2)
来自文档:
char:char数据类型是一个16位Unicode字符。它的最小值为'\ u0000'(或0),最大值为'\ uffff'(或65,535(含))。
它们只是16位无符号整数。
人们报告说,如果char > 65535
,结果为char % 65536
,那么我认为您的char c
将是-98 % 65536
,这将导致65536 - 98 = 65438
。
无论如何要100%确定,你为什么不试试呢?
<强>更新强>
我看到你想知道System.out.println(char)
(例如)的输出是什么。
char和String类型的文字可以包含任何Unicode(UTF-16)字符
因此,System.out.println((char)65438)
等同于System.out.println('\uFF9E')
,通过对UTF-16编码表(source)进行查找,它是HALFWIDTH KATAKANA VOICED SOUND MARK
。仅当字体支持此字符时才会打印,其中一种字体为Arial Unicode MS
。