Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将int转换为char,然后再转换回int-donds';Don’不要总是给出同样的结果_Java_Unicode_Char_Int - Fatal编程技术网

Java 将int转换为char,然后再转换回int-donds';Don’不要总是给出同样的结果

Java 将int转换为char,然后再转换回int-donds';Don’不要总是给出同样的结果,java,unicode,char,int,Java,Unicode,Char,Int,我试图从int值>0xFFFF中获取char。但是,我总是返回相同的char值,当转换为int时,打印值65535(0xFFFF) 我不明白为什么它会为unicode>0xFFFF生成符号 int hex = 0x10FFFF; char c = (char)hex; System.out.println((int)c); 我希望输出是0x10FFFF。相反,输出返回为65535这是因为int是4个字节,而char只有2个字节。因此,不能像在int中那样在char中表示所有值。使用标准无符号整

我试图从
int
值>
0xFFFF
中获取
char
。但是,我总是返回相同的
char
值,当转换为
int
时,打印值
65535
0xFFFF

我不明白为什么它会为unicode>
0xFFFF
生成符号

int hex = 0x10FFFF;
char c = (char)hex;
System.out.println((int)c);

我希望输出是
0x10FFFF
。相反,输出返回为
65535

这是因为
int
是4个字节,而
char
只有2个字节。因此,不能像在
int
中那样在
char
中表示所有值。使用标准无符号整数表示法,只能在2字节值中表示从
0
2^16-1==65535
的值范围,因此如果将该范围之外的任何数字转换为2字节值并返回,则会丢失数据。

int为4字节。字符是2字节。 您的数字在int可以容纳的范围内,但不是哪个char可以容纳。
因此,当您将该数字转换为字符时,它会丢失数据并成为字符所能容纳的最大值,这就是它所打印的内容,即65535。您的数字太大,无法成为2字节的字符。但它足够小,可以容纳4字节的int。65535是适合一个字符的最大数量,所以你得到了这个值。另外,如果一个字符足够大,可以容纳您的数字,那么当您将其返回为int时,它可能返回0x10FFFF的十进制值,即1114111。

不幸的是,我认为您希望Java
字符与Unicode码点是一样的。它们不是一回事

正如其他答案所表达的那样,Java
char
,只能支持16位表示的代码点,而Unicode需要21位来支持所有代码点

换句话说,Java
char
本身只支持基本的多语言平面字符(代码点
0xFFFF
),那么您需要代理字符或一对字符来实现这一点。这就是工作原理。在内部,Java字符串也是这样工作的。为了好玩,运行下面的代码段,看看如果一个Unicode代码点是>
0xFFFF
,那么该代码点实际上是如何由2个字符表示的:

//打印带有
//单个unicode代码点:0x22BED。

System.out.println(“您期望的是什么?您知道
int
char
之间的区别吗?是的,我知道区别,但我正在尝试生成一个字符,其UTF8编码为我提供4个字节,但我没有做到这一点。