a = a + b - >无法从int转换为char。一个+ = B - >通

时间:2014-02-27 01:07:24

标签: java arrays

嗨,现在我遇到了一个情况。

String myStrings = new String();
myStrings = "10.42.0.1";
char[] charNum = myStrings.toCharArray(); //convert string to char array
char checkSum = 0;

A:

for(int i = 0; i <= 8; i++) { 
    checkSum += charNum[i]; 
}

B:

for(int i = 0; i <= 8; i++) { 
     checkSum = checkSum +charNum[i]; 
}

编译A:正常工作

编译B:类型不匹配:无法从int转换为char

因为我知道java会隐式地将a+=b转换为a=char(a+b),所以A可以正常工作。 但真正令我担忧的是charNum[i]的错误。好吧,HeadFirstJava告诉我 该数组是一个对象,所以charNum[i]是一个引用变量(4bytes),我接受它。并且charNum[i](引用变量)指向char(2字节),我想使用char(2字节)进行算术运算,但看起来JAVA说不。当我输入

checkSum = checkSum+charNum[i];
( 2bytes )   =  ( 2bytes )  +      ( 4bytes )

这意味着charNum[i]在内存中有4个字节,这让我很困惑,因为我使用char(2字节)来进行数学运算,而不是charNum[i](引用变量)。如果它确实使用charNum[i](4字节,引用变量)来进行数学运算,为什么我得到正确的校验和值?任何人都可以告诉我,我是否误认为是HeadFirstJava还是我错过了一些概念?

如果你能详细解释一下,那将非常感激。

提前感谢。

2 个答案:

答案 0 :(得分:2)

比你想象的更简单:)。

如果您添加两个char,则会创建int。总是


你做的事情不对:array of char中的单元格值为char,而不是引用,因此charNum[i]char且只有2个字节宽度。

答案 1 :(得分:2)

答案在于二进制数字促销。所有操作数都被提升为更宽操作数的类型,并且至少为int。这由JLS, Section 5.6.2

描述
  

2。扩展原始转换(第5.1.2节)用于转换以下规则指定的一个或两个操作数:

     
      
  • 如果任一操作数的类型为double,则另一个操作数转换为double。

  •   
  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。

  •   
  • 否则,如果任一操作数的类型为long,则另一个操作数转换为long。

  •   
  • 否则,两个操作数都转换为int

  •   

(强调我的)

因此,charcheckSum)加上charcharNum[i])是int