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

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

这称为缩小基元转换 。 根据规格:

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

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

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

int i = 255; byte b = (byte)i; 

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

 int i = 0xff00; byte b = (byte)i; 

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

或者只是直接复制整数的最后8位

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

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

例如

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

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

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

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

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

你可能想看看这个关于施放'短'的问题。

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

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

 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