JAVA:为什么带负号的字节的二进制文字被认为是整数类型?

时间:2013-09-18 10:33:46

标签: java

我无法理解以下行为。

我正在尝试使用二进制文字声明字节掩码:

byte mask = 0b1111_1111;

但那是不可能的,因为我收到以下错误消息:

  

类型不匹配:无法从int转换为字节

最有趣的是,当我尝试直接声明蒙版时,以十进制表示

byte mask = -1;

我没有错误,但这两个表示应该完全相同!

我做错了什么? 提前谢谢。

5 个答案:

答案 0 :(得分:7)

您可以安全地将-2^7 to 2^7-1 (-128 to 127)的值分配给byte,因为它是8位。

0b1111_1111 = 255

所以需要演员

 byte mask = (byte) 0b1111_1111;

答案 1 :(得分:4)

0b1111_1111等于255,超出byte [-128, 127]的范围(因为它已签名)。使用:

byte mask=(byte)0b1111_1111&0xff;

缩小将删除(全零)高位,并将8变为8,而不考虑符号。

答案 2 :(得分:1)

您的“字节掩码”相当于0xff255,它们太大而不适合8位带符号的byte,而不是-1,因为代码中的文字是int。如果该值在较小类型的范围内,编译器可以安全地将其填充到那里,但它无法安全地将范围-128..127之外的值分配给byte变量,并且您'我需要演员。

答案 3 :(得分:1)

所有数字文字都被视为'int',除非另有说明,否则它们包含小数点或'e'。

答案 4 :(得分:1)

你可以像这样输入

    byte mask = (byte) 0b1111_1111;