【问题标题】:Multiple casts in succession not working as intended [duplicate]连续多次投射无法按预期工作[重复]
【发布时间】:2015-12-28 04:49:49
【问题描述】:

据我了解,强制类型转换用于将值从一种类型转换为另一种类型。

我在 Joshua Bloch 和 Neal Gafter 所著的《Java Puzzlers: Traps, Pitfalls, and Corner Cases》一书中找到了以下程序

这个程序连续使用三个转换:

public class Multicast {  
    public static void main(String[] args) {  
      System.out.println((int) (char) (byte) -1);  
  }  
}

我以为它会打印-1,但它正在打印它打印65535,但是为什么?

【问题讨论】:

标签: java


【解决方案1】:

表达式:(int) (char) (byte) -1

  1. -1 是 int 类型
  2. (byte) -1 是一个值为 -1 的字节
  3. (char) (byte) -1 首先将值为 -1 的字节再次符号扩展为值为 -1 的 32 位整数。这意味着所有 32 位都设置为 1(32 位中 -1 的二补码编码)。然后将其转换为类型 char,这是一个无符号的 16 位值,因此您将 16 位设置为 1,其值为 65535。
  4. (int) (char) (byte) -1 通过再次将其显式转换为 32 位整数,您可以确保将其打印为数字而不是代码点为 65535 的字符。

【讨论】:

    【解决方案2】:

    java 中的 char 是一个无符号的 16 位整数。如果将负整数文字(如 -1)转换为 char,则该值被解释为正数;在本例中为 65535- 或 Unicode 字符 \uFFBF。

    仅使用 char 检查此 -1 强制转换,

    System.out.println( (char) -1);
    

    如果它使用intbyte 类型转换,则仅返回-1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 2021-11-08
      相关资源
      最近更新 更多