-128作为Java中的二进制文字

imr*_*ole 9 java

基于bytejava 中的类型是带符号的8位 二进制补码整数的事实,为什么第二种声明字节的方式不起作用?

byte ok = -128;
byte notok = 0b10000000;
Run Code Online (Sandbox Code Playgroud)

我的理解是1000000应该是-128但是java表明notok上面的变量应该是a int而不是abyte

Eng*_*uad 9

0b10000000是一个等于的int文字(= 0b00000000000000000000000010000000)+128.byte保持8位,不能代表+128.但是,您可以按如下方式实现此目的:

byte notok = (byte) 0b10000000;
Run Code Online (Sandbox Code Playgroud)

  • @imrichardcole文字`0b10000000`代表`int`,而不是`byte`.这就是为什么. (4认同)
  • 我可能会补充一点,int literal的赋值只能起作用于implicite,这可能会让它更清楚一点. (2认同)

Am_*_*ful 5

实际上,如所述Eng Fouad0b10000000是整数文字。整数文字会创建一个int值,在Java中其大小为32位。字节数据类型为8位带符号的二进制补码整数。

因此,将整数文字分配给字节类型将不起作用。要在两种不兼容的类型之间创建转换,必须使用强制转换。

 b = (byte)0b10000000;        // (This is narrowing conversion)
Run Code Online (Sandbox Code Playgroud)

另外,的带符号2的补码表示形式-128110000000。但是,MSB的1可以被丢弃(表示负号位),因此10000000作为-128的2的补码表示是可以接受的。