多播期间的行为改变
以下是一个简单的陈述
System.out.println((int)(char)(byte)-1);
- 当我运行它时,输出为
65535
。 我不知道它的原因。 - 在执行期间(字节)-1返回-1,因此
(int)(char)(byte)-1
相当于(int)(char)-1
。 当我打印(char)-1打印?
仅在某些系统中,但不在所有系统中。 - 如果我忽略上面提到的第二点和print(int)’?’ 然后它打印63
所以我的问题是如果我一起组播多数(int)(char)(byte)-1
然后我得到65535
但是如果我按部分进行
- (字节)-1-
- (炭)-1-
- (INT) ‘?’
然后我得到63,为什么会这样?
对于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的解释)
它是关于将签名类型转换为无符号类型。 在Java中, char
范围是[0,2^16)
。 因此,当您尝试将-1
(带符号类型,负值)转换为无符号类型时,您最终会得到
2^16 - 1 = 65535