我有以下代码:
int a=-12;
char b=(char) a;
System.out.println(b);
System.out.println(b+0);
首先打印出一些空字符,然后打印一个数字65524.如果我将a
更改为16
,则显示的数字将变为65520.如果a
为-2
},数字是65534.
如果数字是正数且足够小,它会打出Unicode表格中的字符,如果一切正常则返回字符的数字(与a相同),如果一切都不正确,则返回上面的前一个奇数(如果{ {1}}太大了。
例如,对于a
,它返回℃(摄氏度)字符和a = 8451
本身(8451),但如果a
它返回一些奇怪的中文符号,并且与{{{1}不同1}}数字(18974)。如果a=84510
更大a
,则返回空sumbol和58668.
问题是,这些数字来自哪里?
我试图找到答案,但到目前为止并不幸运。
编辑由于int to char是一个缩小的转换,请考虑与a
a相同的问题。太大的数字现在显然是不可能的,但我想知道底片会发生什么 - 将a=845100
转换为char会产生与byte
相同的奇怪数字。
答案 0 :(得分:4)
int
是带符号的数字, 4字节且 32位。 -12的两个补码表示
11111111 11111111 11111111 11110011。
char
是无符号的, 2个字节且 16位。
int a=-12;
char b=(char)a;
b的两个补码表示是
11111111 11110011
相当于 65524
答案 1 :(得分:0)
我认为这是因为 Java 中的char
是未签名的" 双字节"整数。当 Byte 是8位时,双字节是16位= 2次幂乘16 = 65536你得到 两个补码 (二进制减法运算)。
因为数字是无符号的,所有16位用于表示整数,所以当你给出一个负数时,它会创建一个 overflow 你得到的数字是(65536 + a),例如:
当int a = -16;
获得65536 - 16 = 65520
时(二进制:1111 1111 1111 0000)
当int a = -2;
得到65536 - 2 = 65534
时(二进制:1111 1111 1111 1110)
当int a = 84510;
超过char
的限制65536时,您将留下18974(84510 - 65536 = 18974)。
您从 Unicode 表中获得了一个字符,我猜是因为它是您定义的字符集或代码页。
当您cast
时,您应该注意所投放的数据类型的值范围,在这种情况下,int
和char
之间的差异。