我知道Java不允许无符号类型,所以我想知道它是如何将整数转换为字节的。假设我有一个值为255的整数a,并将该整数转换为字节。那么在字节中表示的值是11111111吗?换句话说,该值被视为有符号8位整数处理,还是直接复制整数的最后8位?
int i = 255;
byte b = (byte)i;
因此,十六进制中be的值为0xFF,但十进制值为-1。
int i = 0xff00;
byte b = (byte)i;
或者它只是直接复制整数的最后8位
是的,这就是此转换的工作方式。
130
会得到一个超出字节范围的余数130
。 - undefinedint a;
byte b;
// …
b = (byte) a;
Integer i=new Integer(2);
byte b=i; //will not work
final int i=2;
byte b=i; //fine
Byte b=new Byte(2);
int a=b; //fine
关于所说的一点想法:在将整数转换为字节时,始终使用0xFF(对于整数)进行掩码处理。(假设myInt的值从0到255)。
例如:
char myByte = (char)(myInt & 0xFF);
char
是16位。如果你将例子改成byte
也不行,可能仍会产生负值。你可以使用0x7F掩码,但这样会导致负值无法正确转换。确保不会遇到问题的好方法可能是 assert -128 <= myInt && myInt <= 127;
。 - Philippe Beaudoinshort
有多大? - Buhake Sindishort
是有符号的两字节类型,而 char
是无符号的两字节类型。 - Michael Myersfor (int i=0; i <= 255; i++) {
byte b = (byte) i; // cast int values 0 to 255 to corresponding byte values
int neg = b; // neg will take on values 0..127, -128, -127, ..., -1
int pos = (int) (b & 0xFF); // pos will take on values 0..255
}
当一个字节包含大于127的值时(即值0x80到0xFF),将其转换为int会导致字节值的高位比特(即0x80比特)进行符号扩展。要删除“额外”的一位,使用x& 0xFF;这将强制高于0x80(即0x100、0x200、0x400等)的位为零,但保留低8位不变。
您也可以编写以下内容;它们都是等效的: int pos = ((int) b) & 0xFF; //先将b转换为int,然后剥离高位 int pos = b & 0xFF; //作为int算术完成--不需要转换
在执行算术运算时,Java会自动将大小(以位数计)小于int的整数类型“提升”为int值。这样做是为了提供比较确定的结果(与C语言相比,其规范性较低)。
您可能想看看有关转换“短”的问题的此问题。