在这段代码中:
c = (char)(c - 'A' + 'a');
为什么我们需要(char)
?这种类型的投射对吗?
假设赋值语句右侧的c
是大写字母。我假设我们在这里进行Unicode加法和减法。
这是我正在阅读的Java书籍的片段:
对char进行算术运算时,首先将其转换为int 在Unicode系统中表示它。从a中减去'A' 变量c基本上问“大写字母有多远。” c中的字符?“添加'a'然后产生相同的int 到小写字母字符代码序列的距离。 需要转换为char,因为char是一种特殊的int 更有限的价值范围。通过使用演员,程序员 承认他或她理解的特殊性 赋值并期望值在正确的范围内,0到 66535
我不明白(char)
施法者的观点?如果我们没有使用(char)
演员,会有什么不同?什么是更普遍的铸造?
答案 0 :(得分:7)
int
是Java中的integral type,当您执行算术时,结果为int
(JLS-4.2.2. Integer Operations部分地表示数值运算符,这会产生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);
)。
'A' = 65
'a' = 97
我得到了
.row {
margin-right: -15px;
margin-left: -15px;
}
答案 1 :(得分:7)
这是由于numeric promotion。引用JLS section 15.18.2:
二进制
-
运算符在应用于两个数值类型的操作数时执行加法,产生操作数的总和。二进制
int
运算符执行减法,产生两个数字操作数的差异。对操作数执行二进制数字提升(第5.6.2节)。
在这种情况下,数字促销是widening primitive conversion。引用section 5.6.2:
应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:
...
- 否则,两个操作数都将转换为
char
类型。
因此,在您的示例中,转换为int
是必要的,因为添加是在int
值上执行的,因此结果也是char
类型。要将其存储在{{1}}中,您需要显式转换。
答案 2 :(得分:2)
您在编程中所做的就是为变量赋值。这些变量可以是不同类型的。最后,所有内容都是以某种方式处理的数字或作为一个“实体”处理的序列/数字集。不同类型的变量可占用不同的空间量。
如果你有两件事以不同的方式处理并占用不同的空间,你需要一个明确定义的方法来转换这两件事,这是由铸造和操作员完成的。操作员接受许多输入并给出输出。 +和 - 通常需要2个输入并返回1个。
在您的情况下,您使用了使用字符的运算符,取出它们的位并将它们用作数字,并将结果数字作为int返回。然后,您需要手动将该数字转换回字母,因为您可能会丢失字节。此处的显式强制转换可防止处理数字并将其意外转换为字母的程序员的错误,编译器会对它们发出警告。最后,所有这些都归结为规范,这些规范确切地说明了每种输入类型和每个操作符的发生情况。
大多数情况下,当有这样的方式时,完成转换是为了给你一种直观而简单的转换类型的方法。大多数情况下,这是通过数字完成的,因为唯一的区别是提供的咬合量(字节,短,整数,长),有时是内部计算(浮点数,双精度)。在这些情况下,通过转换为具有较少字节或整数表示的类型,可以轻松完成剪切和舍入,并且通过强制转换为具有更多字节的类型或具有浮点的类型来添加字节或将表示更改为小数点表示。
另一方面,有时您希望将一个对象视为更一般的情况并将其转换为祖先类型(也称为超类型等)。例如。当您对对象进行排序时,您可能不关心在编写排序算法时所处理的确切类型。