在寻找以下情况时,我正在寻找有关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的哪种表示形式?
答案 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 0
。 char '0'
的二进制表示形式占16位:
0000 0000 0011 0000
int 0
的二进制表示形式占用32位:
0000 0000 0000 0000 0000 0000 0000 0000
当您将char
和int
相加时,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类型。
请注意最后一句话:这定义了要应用的转换,称为“数字升级”。