Int to char转换,错误号码

时间:2017-02-19 06:05:52

标签: java unicode casting

我有以下代码:

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相同的奇怪数字。

2 个答案:

答案 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时,您应该注意所投放的数据类型的值范围,在这种情况下,intchar之间的差异。