【问题标题】:What is point of type casting?什么是类型转换?
【发布时间】:2016-04-02 20:05:35
【问题描述】:

在这段代码中:

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

为什么我们需要(char)?那是类型转换对吗?

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

这是我正在阅读的 Java 书籍中的 sn-p:

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

我不明白(char) 演员表的意义?如果我们不使用(char) 演员表会有什么不同?什么是更普遍的投射?

【问题讨论】:

  • 简而言之:在java中,数字8可以被视为一个字符而不是整数......所以8 + 8可能给出88而不是16......因为8应该被认为是整数airthmetic 操作,, 我们输入 caste 为int

标签: java casting


【解决方案1】:

你在编程中所做的就是给变量赋值。这些变量可以是不同的类型。最后,一切都是以某种方式处理的数字或作为一个“实体”处理的数字序列/集合。不同类型的变量可以占用不同数量的空间。

如果您有两件事情以不同的方式处理并占用不同数量的空间,那么您需要一种明确定义的方式来在两件事情之间进行转换,这是通过强制转换和运算符来完成的。操作员接受许多输入并给出输出。 + 和 - 通常取 2 个输入并返回 1 个。

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

大多数情况下,转换是为了给你一种直观而简单的转换类型的方法,如果有这种方法的话。大多数情况下,这是用数字完成的,因为唯一的区别是提供的位数量(字节、短、整数、长),有时是内部计算(浮点数、双精度数)。在这些情况下,切割和舍入很容易通过转换为具有较少字节的类型或整数表示来实现,并且通过转换为具有更多字节的类型或具有浮点的类型来添加字节或将表示更改为小数点表示。

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

【讨论】:

    【解决方案2】:

    这是由于numeric promotion。引用 JLS section 15.18.2:

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

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

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

    本例中的数字提升是widening primitive conversion。引用section 5.6.2:

    加宽原语转换(第 5.1.2 节)适用于转换以下规则中指定的一个或两个操作数:
    ...

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

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

    【讨论】:

      【解决方案3】:

      char 在 Java 中是一个 integral type,当你执行算术运算时,结果是一个 int(JLS-4.2.2. Integer Operations 部分表示 数字运算符,它产生一个 @ 类型的值987654326@ 或 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
      

      【讨论】:

      • % 标记一个变量,c 代表char,d 代表十进制,n 代表换行符,变量以与字符串中相同的顺序作为最后的参数提供。有关您可以使用的格式执行的操作列表,您可以查看docs.oracle.com/javase/tutorial/java/data/numberformat.html
      • 也可以在 % 和变量类型之间使用标志,例如。 %10d 将格式化一个数字,使其占用 10 个字符(用空格或 0 填充)
      • 所以如果我在 + 的任何一侧是 char 类型时执行 +,它会产生 int 类型的值?
      猜你喜欢
      • 2014-04-04
      • 1970-01-01
      • 2014-03-21
      • 2021-11-18
      • 1970-01-01
      • 2016-11-04
      • 2011-11-25
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多