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。 希望这个例子提供一些理解..