【问题标题】:behavioral change during multicasting [duplicate]多播期间的行为变化[重复]
【发布时间】:2015-06-16 10:47:21
【问题描述】:

以下是一个简单的陈述

System.out.println((int)(char)(byte)-1);
  1. 当我运行它时,我得到的输出为65535。我不知道原因 它。
  2. 在执行期间(字节)-1 返回-1,因此(int)(char)(byte)-1 等价于(int)(char)-1。当我打印 (char)-1 时,它会在某些系统中打印? ,但不是在所有系统中。
  3. 如果我忽略上面提到的第二点并打印 (int)'?'然后它 打印 63

所以我的问题是,如果我一起进行多播,即(int)(char)(byte)-1,那么我得到65535,但如果我逐部分进行投射

  • (字节)-1
  • (char)-1
  • (int)'?'

那我得到63,为什么会这样?

【问题讨论】:

标签: java


【解决方案1】:

对于 1):

首先,你有一个整数(32 位)-1 的二进制表示是:

1111 1111 1111 1111 1111 1111 1111 1111 

然后,它被转换为一个字节(8位):

1111 1111

如果您打印它,您将得到 -1(即 -1 的 byte 表示),然后将其转换为 char(一个 16 位无符号字符),这将为您提供:

1111 1111 1111 1111

(因为它会“扩展”符号)如果您尝试将其打印为字符,您将得到一个“无法识别”的字符(在某些系统中它会打印问号)然后,您进行强制转换int;但是,char 是无符号的,所以符号有扩展(因为没有符号),所以你终于有了:

0000 0000 0000 0000 1111 1111 1111 1111

十进制等于65535

对于 2):

不,(int)(char)(byte)-1 不等同于 (int)(char)-1(参见 #1 的说明)

【讨论】:

    【解决方案2】:

    这是关于将有符号类型转换为无符号类型。在 Java 中,char 范围是 [0,2^16)。因此,当您尝试将 -1(有符号类型,负值)转换为无符号类型时,您最终会得到

    2^16 - 1 = 65535
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      相关资源
      最近更新 更多