int i = 234;
byte b = (byte) i;
System.out.println(b); // -22
int i2 = b & 0xFF;
System.out.println(i2); // 234
我正在查看此代码,并对如何存储它们的值感到困惑。第一个int存储为32位(4个字节)。 b转换为二进制并存储其有符号值(8位)。 i2是将它存储为8位无符号表示还是将其转换回32位?
答案 0 :(得分:1)
Java没有无符号的基元类型。所有byte
变量都是带符号的8位值。
最高有效位是否被解释为符号位,当您执行逐位操作时,运算符将使用所有存在的位。为了具体化,以下内容是等效的:
i2 = b & 0xFF;
i2 = b & ((byte) -1);
答案 1 :(得分:0)
i2声明为int,因此它应该是一个完整的32位值。它将包含b的二进制AND,在这种情况下是低8位和0xFF。
答案 2 :(得分:0)
事物不会“存储为”未签名或签名的表示。这是一个挑剔的区别,但它似乎是你感到困惑的地方。唯一的区别是如何解释这些位。这里发生的事情如下:
i
存储值11101010(加上一些高阶字节数)。在Java的整数存储格式约定下,这表示值234。b
存储值11101010,因为int
只需截断它们即可转换为byte
。在Java的数字字节存储格式约定下,这表示值-22。i2
存储值11101010(加上一些高阶字节数),因为按位操作应用于b
,因此直接复制了它的位。 (如果你写了int i2 = b
或int i2 = b + 0
,该字节将被转换为其数值-22,然后存储为-22的int
表示。