Java int和char之间的隐式转换

时间:2019-01-28 13:01:29

标签: java casting type-conversion ascii

在寻找以下情况时,我正在寻找有关Java行为的解释。我知道ASCII表的排列方式使字符5的值比0大五个位置。如第一个示例所示,这允许对char进行计算而无需转换为int。

我不明白的是,为什么Java似乎不一致地处理何时从ASCII表提供值以及何时对char进行计算,就好像它们是整数一样。

int x = '5' - '0';

输出x = 5;

int x = '5'

输出x = 53;

现在来看一些例子,这会引起混乱。

int x = '0' + 1 - '5'

输出x = -4

int y = '5' - '0' + '1'

输出54

int y = '5' - 0 + '1'

输出102

Java似乎在进行隐式类型转换,但是Java如何推断它应该使用int / char的哪种表示形式?

5 个答案:

答案 0 :(得分:5)

只需将char转换写为ASCII代码(在语句下方)

int x = '0' + 1 - '5'
        48  + 1 - 53 = -4 

int y = '5' - 0 + '1'
         53 - 0 + 49 = 102

int y = '5' - '0' + '1'
         53 - 48  + 49 = 54

请注意,这是一致的,每个int保持为int,每个char转换为ASCII码

答案 1 :(得分:1)

char '0'不等于int 0char '0'的二进制表示形式占16位:

0000 0000 0011 0000

int 0的二进制表示形式占用32位:

0000 0000 0000 0000 0000 0000 0000 0000 

当您将charint相加时,char将首先提升为int

例如。 char 5的{​​{3}}是0035,在二进制0000 0000 0011 0101中,将在头部0000 0000 0000 0000 0000 0000 0011 0101和int处插入16个零将其提升为int代表53(十进制)。

答案 2 :(得分:1)

这似乎不一致,但实际上它们是一致的。

int x = '5' - '0';

输出x = 5;因为后面的ASCII码为'5'= 53和'0'= 48。 因此

int x = '5'

输出x = 53;

答案 3 :(得分:1)

您可能正在混合值中的表示形式。值永远不会改变,因此当您执行算术运算时,它将始终是'5'== 53而不是5。对于显示JLS on primitive to string conversion

对于大多数计算,将整数算术提升为int。

System.out.println('5' + '0');
>>> 101

System.out.println((char)('5' + '0'));
>>> e

两个结果都具有相同的数值,但是一个结果显示为字符,因为它已强制转换为字符。

答案 4 :(得分:1)

  

Java似乎在进行隐式类型转换,但是Java如何推断它应该使用int / char的哪种表示形式?

实际上很简单。 char是Java中的数字类型之一,请参见4.2.1. Integral Types and Values

  

整数类型的值是以下范围内的整数:

     
      
  • [...]
  •   
  • 对于char,从'\ u0000'到'\ uffff'(包括0到65535)
  •   

对整数类型的所有运算均以int-或long-精度执行,请参见4.2.2. Integer Operations

  

如果除移位运算符以外的整数运算符至少具有一个long类型的操作数,则使用64位精度执行该运算,并且数值运算符的结果为long类型。如果另一个操作数不长,则首先将其加宽(§5.1.5)以通过数字提升(§5.6)来键入long。

     

否则,将使用32位精度执行运算,并且数值运算符的结果为int类型。如果任何一个操作数都不是int,则首先通过数值提升将其扩展为int类型。

请注意最后一句话:这定义了要应用的转换,称为“数字升级”。