什么是点型铸造?

Jwa*_*622 9 java casting

在这段代码中:

c = (char)(c - 'A' + 'a');
Run Code Online (Sandbox Code Playgroud)

我们为什么需要(char)?这是类型铸造吧?

假设c赋值语句的右侧是大写字母.我假设我们在这里进行Unicode加法和减法.

这是我正在阅读的Java书籍的片段:

对char进行算术运算时,首先将其转换为在Unicode系统中表示它的int.从变量c中减去'A'基本上要求"大写字母在c中的字符有多远?"添加'a'然后产生与小写字母字符代码序列相同距离的int.需要转换为char,因为char是一种特殊类型的int,具有更有限的值范围.通过使用强制转换,程序员确认他或她理解赋值的特殊性质,并期望值在正确的范围内,0到66535.

我不明白(char)演员的观点?如果我们不使用(char)演员会有什么不同?什么是更普遍的铸造?

Ell*_*sch 7

char是Java中的一个整数类型,当你执行算术时,结果是一个int(JLS-4.2.2.整数运算部分地说是数值运算符,它产生一个类型的值int或者long添加包含加法运算符的值)+-).

char c = 'A';
System.out.printf("'%c' = %d%n", c, (int) c);
int d = (c - 'A' + 'a'); // c - 65 + 97
System.out.printf("'%c' = %d%n", (char) d, d);
Run Code Online (Sandbox Code Playgroud)

我明白了

'A' = 65
'a' = 97
Run Code Online (Sandbox Code Playgroud)


Tun*_*aki 7

这是由于数字促销.引用JLS 部分15.18.2:

+当应用于两个数字类型的操作数时,二元运算符执行加法,产生操作数的总和.

二元-运算符执行减法,产生两个数字操作数的差异.

对操作数执行二进制数字提升(第5.6.2节).

在这种情况下,数字促销是一个扩大的原始转换.引言5.6.2节:

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

  • 否则,两个操作数都将转换为类型int.

因此,在您的示例中,强制转换char是必要的,因为对int值执行了添加,因此结果也是类型int.要将其存储在a中char,您需要显式转换.