如何将整数转换为Java中的字节?

时间:2010-03-16 22:03:49

标签: java int byte casting

我知道Java不允许使用无符号类型,所以我想知道它是如何将整数转换为字节的。假设我有一个值为255的整数a,我将整数转换为一个字节。值是否以字节11111111表示?换句话说,将值更多地视为带符号的8位整数,还是直接复制整数的最后8位?

8 个答案:

答案 0 :(得分:20)

这称为narrowing primitive conversion。根据规范:

  

将有符号整数缩小转换为整数类型 T 只会丢弃除 n 最低位之外的所有位,其中 n 是用于表示类型 T 的位数。除了可能丢失有关数值大小的信息之外,这可能会导致结果值的符号与输入值的符号不同。

所以这是你列出的第二个选项(直接复制最后8位)。

我不确定你是否知道如何表示有符号的整数值,所以为了安全起见我会指出{{3}中的字节值1111 1111等于-1系统(Java使用)。

答案 1 :(得分:4)

  

还是直接复制最后一个   8位整数

是的,这就是这个演员的工作方式

答案 2 :(得分:4)

int i = 255;

byte b = (byte)i;

因此,以十六进制表示的值为0xFF,但十进制值为-1。

int i = 0xff00;

byte b = (byte)i;

b的值现在是0x00。这表明java占用了整数的最后一个字节。即。最后8位,但这是签名。

答案 3 :(得分:1)

只是想一想:在转换为 0xFF (对于整数)的字节时,始终屏蔽整数。 (假设myInt被赋值为0到255)。

e.g。

char myByte = (char)(myInt & 0xFF);

为什么呢?如果myInt大于255,则仅对字节进行类型转换会返回一个您不想要的负值(2的补码)。

答案 4 :(得分:1)

根据我的理解,你的意思是

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

答案 5 :(得分:1)

字节是8位。 8位可以代表256个数字。(2提升到8 = 256)
现在第一位用于标志。 [如果为正则则第一位= 0,如果负第一位= 1] 假设您要将整数1099转换为字节。只需将1099除以256.余数是int的字节表示     示例
 1099/256 =>余数= 75
 -1099/256 =>余数= -75
 2049/256 =>余数= 1
原因?看看这张图片http://i.stack.imgur.com/FYwqr.png

答案 6 :(得分:0)

for (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&amp; 0xFF的;这会强制高于0x80的位(即,位0x100,0x200,0x400,...)为零,但保留低8位。

你也可以写这些;它们都是等价的:     int pos =((int)b)&amp; 0xFF的; //首先将b转换为int,然后剥离高位     int pos = b&amp; 0xFF的; //完成为int算术 - 不需要强制转换

Java在运算时自动“提升”大小(以位数为单位)小于int的整数类型为int值。这样做是为了提供更确定的结果(比如C,在规范中受到的限制较少)。

您可能需要查看this question on casting a 'short'.

答案 7 :(得分:0)

以下片段将 int 强制转换为 byte 。如果整数的值大于 byte 的范围,则会对 byte 的范围取模(整数除以整数的余数)。

int a;
byte b;
// …
b = (byte) a;