Java – char,int转换

在Java中,允许以下内容:

char c = 'A' + 1; 

在这里,c将保持值“B”。 以上,首先评估expression式。 所以'A'被转换为65,整个expression式计算为66,然后66被转换为'B',因为我们将这个值存储在一个char中。

但是,下面给出了一个编译时错误:

 char c = 'A'; c = c + 1; 

Java如何以不同的方式查看expression式的解释是什么? 顺便说一下,以下工作也很好:

 char c = 'A'; c++; 

这只是规范。 将int转换为char是一个缩小的转换, 'A' + 1是一个常量expression式 。 常量expression式(基本上)是一个expression式,其结果总是相同的,并且可以由编译器确定。 当它是一个常量expression式时,允许缩小转换分配字节,short和char。

这是什么JLS转让转换说:

如果variables的types是byte,short或char,并且常量expression式的值可以用variables的types表示,则可以使用缩小的原始转换。

c + 1不是一个常量expression式,所以编译时错误发生在赋值上。 通过查看代码,我们可以确定结果应该始终相同,但编译器无法确定它。

我们能做的一件有趣的事情是:

 final char a = 'a'; char b = a + 1; 

在这种情况下, a + 1是一个常数expression式,因为a是最终的。

对常量expression的警告是,以下内容也不会被编译:

 char c = 'A' + 99999; 

因为'A' + 99999的值在chartypes中不能表示。

至于其他运营商,如你所说的++ ,他们有自己的规格。 ++的相关位 (以及类似的所有增量和减量)是:

后缀增量expression式的types是variables的types。

在添加之前,对值1和variables的值执行二进制数字提升(第5.6.2节)。 如果有必要的话,这个总和会被缩小的原始转换(§5.1.3)…variables存储之前的variablestypes所缩小。

(推测转换是为char完成的。)值得注意的是+=自动执行缩小转换 。 所以c += 1; 也将编译。

char到int的转换被称为加宽转换。 在扩大转换范围时,值不会丢失数字值的整体大小的信息,其中像char转换的int被称为缩小转换。 如果缩小转换范围,则可能会丢失有关数值整体大小的信息,并且可能会失去精度。

有关原始转换的更多信息,请参阅此文档。

这是因为编译器可以检查它('A' + 1)是否在char的范围内,而不能检查c + <an integer>是否在范围内。

它是因为整数或小于int的字面值作为字节,short和char是int 。 以这种方式了解以下内容。

码:

  byte a = 10;//compile fine byte b= 11;//compile fine byte c = a+b;//compiler error[says that result of **a+b** is **int**] 

对于“除法”,“乘法”和其他算术运算的任何math运算也是如此。 所以将结果转换为所需数据types的文字

 byte c = (byte)(a+b); 

所以当你执行

  c= c+1;//compiler error 

它的结果是c + 1是int而不是char。 所以编译器给出一个编译时错误相同。 所以你需要提供一个原始的强制转换来将字面量改为char数据types。 希望这个例子提供一些理解..