多播期间的行为改变

时间:2015-06-16 10:47:21

标签: java

以下是一个简单的陈述

System.out.println((int)(char)(byte)-1);
  1. 当我运行它时,输出为65535。我不知道原因 它。
  2. 执行期间(字节)-1返回-1,因此(int)(char)(byte)-1相当于(int)(char)-1。当我打印(char)-1时,它会在某些系统中打印? ,但不会在所有系统中打印。
  3. 如果我忽略上面提到的第二点并打印(int)'?'然后呢 打印63
  4. 所以我的问题是,如果我一起进行多播,(int)(char)(byte)-1然后我得到65535,但如果我按部分进行投射那么

    • (字节)-1
    • (炭)-1
    • (int)的 '?'

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

2 个答案:

答案 0 :(得分:0)

关于将签名类型转换为无符号类型的问题。在Java中,char范围是[0,2^16)。因此,当您尝试将-1(带符号类型,负值)转换为无符号类型时,最终会使用

2^16 - 1 = 65535

答案 1 :(得分:0)

1):

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

1111 1111 1111 1111 1111 1111 1111 1111 

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

1111 1111

如果你打印出来,那么你得到-1(那个byte表示为-1)然后,它被转换为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的解释)