当前位置: 首页 > 知识库问答 >
问题:

类型铸造的意义是什么?

濮阳弘扬
2023-03-14

在这段html" target="_blank">代码中:

c = (char)(c - 'A' + 'a');

为什么我们需要(char)?那是类型铸造,对吗?

假设赋值语句右侧的c是大写字母。我想我们在做Unicode的加法和减法。

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

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

我不明白(char)演员阵容的要点是什么?如果我们不使用(char)强制转换,会有什么不同?一般来说,什么是铸造?

共有3个答案

杜凯
2023-03-14

编程中要做的就是给变量赋值。这些变量可以是不同的类型。归根结底,一切都是以某种方式处理的数字,或者是作为一个“实体”处理的一系列数字。不同类型的变量可以占用不同的空间。

如果你有两个东西以不同的方式处理,占用不同的空间,你需要一个定义良好的方式来转换这两个东西,这是由铸造和操作员完成的。运算符接受许多输入并给出一个输出。和-通常接受2个输入并返回1个。

在您的例子中,您使用了一些运算符,这些运算符接受字符,将它们的位用作数字,并将结果数字返回int。然后您需要手动将该数字转换回字母,因为可能会丢失字节。此外,这里的显式转换可以防止程序员在处理数字时出错,并意外地将数字转换为字母,编译器会警告他们。最后,所有这些都归结为规范,规范准确地声明了每个输入类型和每个运算符的情况。

大多数时候,铸造是为了给你一个直观和简单的转换类型的方法,当有这样一种方法的时候。大多数情况下,这是用数字来完成的,因为唯一的区别是提供的比特数(字节、短、整数、长),有时是内部计算(浮点、双倍)。在这些情况下,切割和舍入是很容易做到的,并且通过转换为具有较少字节或整数表示的类型来实现,并且通过转换为具有较多字节或具有浮点表示的类型来添加字节或更改表示为小数点...

另一方面,有时您希望将一个对象视为更一般的情况,并将其强制转换为祖先类型(也称为超级类型等)。当您对对象进行排序时,您可能不关心在编写排序算法时您正在处理的确切类型。

方昊英
2023-03-14

这是由于数字促销。引用JLS第15.18.2节:

二进制运算符在应用于两个数字类型的操作数时执行加法,生成操作数的总和。

二进制-运算符执行减法,产生两个数字操作数的差值。

对操作数执行二进制数字提升(§5.6.2)。

在这种情况下,数字提升是一种加宽原语转换。引用第5.6.2节:

加宽基元转换(§5.1.2)适用于按照以下规则指定转换任一操作数或两个操作数:
...

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

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

南门飞扬
2023-03-14

char在Java中是一种整数类型,当您执行算术时,结果是一个int(JLS-4.2.2.整数运算的一部分是数字运算符,其结果是一个intlong类型的值,并添加包括加法运算符-)。

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
 类似资料:
  • 我对Java中的原语类型有一个问题。我使用的是JDK1.6。 如果我有以下信息: 编译器不想编译——它说它“无法从int转换为short”,并建议我转换为,因此: 真的管用。但我的问题是,我为什么要投?a和b的值在-短值范围为{-32768,32767}的范围内。当我想执行操作时,我还需要强制转换-,*,/(我还没有检查其他操作)。 如果我对基元类型执行相同的操作,我不需要将aa bb强制转换为。

  • 在抽象工厂模式中,我使用泛型。我有一个扩展Serializable的BaseEntity接口,Employee类实现了BaseEntity。在抽象类中,我有一个getJavaObj方法 是一种方法,它接受并返回

  • 问题内容: 所以我正在学习Java。我有一个月的时间,我刚刚了解了构造函数。但是我看不到创建一个的全部目的。为什么我什么时候要使用?我知道它没有主方法,您可以从主类中调用构造函数。任何人都可以启发我这个话题,这对我有很大帮助。 问题答案: 构造函数是用来初始化/设置类实例的对象。 如果您有一个对象需要一些处理才能使用(例如,初始化成员),则应在构造函数中执行此操作。 理想情况下,您永远不应拥有“部

  • 问题内容: 试图屈服于Javascript对OO的追求,并且像其他许多人一样,对该属性感到困惑。特别是,属性的重要性,因为我似乎无法使其发挥任何作用。例如: 在上面的示例中,该对象似乎具有名为()的正确构造函数-并且它继承了的age属性。那么为什么很多人建议将此作为必要步骤: 显然,在构造 时 调用了正确的构造函数,那么这个原型属性有什么影响?我很想知道“正确设置”构造函数的属性会对实际产生什么影