Java 为什么我可以生成超过最大值的字符?

Java 为什么我可以生成超过最大值的字符?,java,char,Java,Char,为什么以下代码不生成错误 System.out.println((char) 2147483647); 根据,字符的最大大小为65535 char:char数据类型是单个16位Unicode字符。它的最小值为“\u0000”(或0),最大值为“\uffff”(或65535) 实际上,你的问题的答案是你不能 为什么看不到任何错误? 因为Character.MAX\u值+1=Character.MIN\u值。。。与Integer.MAX_VALUE和其他类似,JVM将其视为一个循环,以避免此类

为什么以下代码不生成错误

System.out.println((char) 2147483647);
根据,字符的最大大小为
65535

  • char:char数据类型是单个16位Unicode字符。它的最小值为“\u0000”(或0),最大值为“\uffff”(或65535)

实际上,你的问题的答案是你不能

为什么看不到任何错误?
因为
Character.MAX\u值+1=Character.MIN\u值
。。。与
Integer.MAX_VALUE
和其他类似,
JVM
将其视为一个循环,以避免此类问题但在尝试计算时给出错误结果


检查进一步的技术信息

这适用于任何数据类型,它被称为
整数溢出
,当对超出要转换的类型大小的任何位进行转换时,都会被切断。

您可以将
int
缩小为
char
,这是允许的:

有符号整数到整数类型
T
的缩小转换只会丢弃除n个最低阶位以外的所有位,其中n是用于表示类型
T
的位数。除了可能丢失有关数值大小的信息外,这还可能导致结果值的符号与输入值的符号不同

生成的
char
不大于。 编译器将
(char)2147483647
转换为
65535

为什么我可以生成超过最大值的字符

2147483647
不是
char
,而是
int

您没有将无效值分配给
char
,而是将有效的
int
强制转换为
char
,然后缩小原始转换规则的应用范围。请参阅:§5.1.3

简言之,保留原始整数的最低16位(“有符号整数到整数类型T的缩小转换只会丢弃n个最低阶位以外的所有位,其中n是用于表示类型T的位数”)

为什么下面的代码不生成错误

System.out.println((char) 2147483647);

因为这不是一个错误,它是一个定义良好的行为。

char
是一种16位数据类型,可以将数值转换为该类型

当您将32位整数转换为16位短整数(或转换为字符)时,会丢失源代码的高位

Int32 i = 2147483647; // 0x7FFFFFFF
Int16 s = (Int16) i;  //     0xFFFF (65535)
char  c = (char)  i;  //     0xFFFF (65535)

它打印什么?不
2147483647
。为什么不呢?这是你的答案…它做了一个缩小转换,2147483647是一个整数,你把它缩小为一个字符。正如您所提到的,char的最大值是65535。如果执行,System.out.println((int)(char)2147483647),你会看到它打印65535而不是2147483647。什么是气流?不…16个MSB位刚刚被丢弃。@AdrianoRepetti我引用的是问题链接。。但我如何理解它可以试图溢出。。。但不会发生…当你施法时不会溢出。最重要的数据只是丢失了。这与旧的语言(如C++)的行为相同。强制转换原语是开发人员的一种表达方式,“是的,我知道我会丢失数据,我接受这一结果。”因此,开发人员应该避免强制转换,除非他们需要,因为编译器会保护您避免意外地做愚蠢的事。
int
,而不是
Integer
?@immibis不是
Integer
,一个
int
!;)是的,谢谢。原来是整数。半。是,删除了个字节。不,与溢出无关。