嗨,现在我遇到了一个情况。
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还是我错过了一些概念?
如果你能详细解释一下,那将非常感激。
提前感谢。
答案 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 。
(强调我的)
因此,char
(checkSum
)加上char
(charNum[i]
)是int
。