6

我无法理解以下行为。

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

byte mask = 0b1111_1111;

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

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

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

byte mask = -1;

我没有错误,但这两种表示应该绝对相等!

我究竟做错了什么?提前致谢。

4

5 回答 5

9

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

其中0b1111_1111=255

所以需要一个演员

 byte mask = (byte) 0b1111_1111;
于 2013-09-18T10:39:03.007 回答
4

该值0b1111_1111等于 255,超出byte的范围[-128, 127](因为它是有符号的)。利用:

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

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

于 2013-09-18T10:36:17.770 回答
1

您的“字节掩码”相当于0xffor 255,它们太大而无法放入 8 位有符号byte, not -1,因为代码中的文字是int. 如果该值在较小类型的范围内,编译器可以安全地将其填入其中,但不能安全地将范围外的值分配给-128..127变量byte,并且您需要进行强制转换。

于 2013-09-18T10:36:11.277 回答
1

所有数字文字都被视为“int”,除非另有强制转换或它们包含小数点或“e”。

于 2013-09-18T10:37:23.953 回答
1

你可以像这样进行类型转换

    byte mask = (byte) 0b1111_1111;
于 2013-09-18T10:38:06.317 回答