基于java中的byte
类型是带符号的8位two's complement整数的事实,为什么第二种声明字节的方式不起作用?
byte ok = -128;
byte notok = 0b10000000;
我的理解是1000000
应为-128
,但java表示上面的notok
变量应该是int
而不是byte
答案 0 :(得分:8)
0b10000000
是一个int
字面值(= 0b00000000000000000000000010000000
),等于+128
。 byte
保留8位,不能代表+128
。但是,您可以按如下方式实现此目的:
byte notok = (byte) 0b10000000;
答案 1 :(得分:4)
实际上,如Eng Fouad
所述, 0b10000000 是整数文字。整数文字创建一个int值,Java中的大小为32位。字节数据类型是一个8位带符号的二进制补码整数。
因此,将整数文字指定为字节类型将不起作用。要在两个不兼容的类型之间创建转换,必须使用强制转换。
b = (byte)0b10000000; // (This is narrowing conversion)
此外,-128
的带符号2的补码表示为110000000
。但是,MSB的1可以被丢弃(代表负号位),因此 10000000 可以作为-128的2的补码表示。