在Java中将short类型转换为byte类型,以及将byte类型转换为short类型

3

我想将一个short转换为2个字节,然后从这两个字节中获取相同的short值。为此,我编写了以下代码:


        short oldshort = 700;

        byte 333= (byte) (oldshort);
        byte byte2= (byte) ((oldshort >> 8) & 0xff);

        short newshort = (short) ((byte2 << 8) + byte1);

            System.out.println(oldshort);
        System.out.println(newshort);

对于旧短整型数值为700,新短整型数值为444。经过测试,看起来这段代码只适用于某些数值。例如,如果旧短整型数值为50,则可以正常工作。但是,如果它是-200或大于127(我认为)的值,则无法正常工作。我想这可能与有符号字节、二进制补码值等有关,但我无法找出解决方法。有任何想法吗?在Java中有任何本地方法吗?提前感谢!

1
在重新组合时,请勿使用加法(+),而应使用按位或(|)。 - Ben Voigt
@Ben - 在这种情况下它们有什么不同? - mdma
不同之处在于OR饱和而ADD进位。更重要的是,当您尝试进行位运算时,请使用位运算符。如果您想要x的位补码,您不会写成-1-x,对吧? - Ben Voigt
2个回答

5
重新组合时,需要对byte1进行掩码处理,以防止其被符号扩展。
例如:
    short oldshort = 700;

    byte byte1= (byte) (oldshort);
    byte byte2= (byte) ((oldshort >> 8) & 0xff);

    short newshort = (short) ((byte2 << 8) + (byte1&0xFF);

        System.out.println(oldshort);
    System.out.println(newshort);

编辑: 在Java中,所有字节和短整型的操作实际上都是作为整数完成的。因此,当您编写+byte1时,实际上正在将字节首先转换为整数(符号扩展)。它仍将具有相同的值,但现在具有更多的位。然后,我们可以屏蔽掉底部的8位,以从短整型获取原始的8位 - 没有符号。

E.g. short =511 = 0x01FE
     // lots of 0x000's because the operations are done on 32-bit int's
     byte1 = (0x000001FE & 0x000000FF) = (0x01FE & 0xFF) = 0xFE = (byte)-2
     byte2 = 0x1

     newShort = (byte2 << 8) + (byte1 & 0xFF)
              = (0x1 << 8) + (0xFE & 0xFF)
            // since the ops are performed as int's
              = (0x00000001 << 8) + (0xFFFFFFFE & 0x000000FF)
            // 0xFFFFFFFE = -2 
              = (0x00000100) + (0x000000FE)
              = 0x000001FE
              = 511

哦,我不知道 (byte1 & 0xFF) 这样做可以让 Java 将其视为无符号数。你能详细说明一下吗? - Cheok Yan Cheng
(byte1 & 0xFF) 转成 int 类型了吗? - Cheok Yan Cheng
1
小于int的整数类型的操作首先会被隐式转换为int。因此,在0xFF与该值进行按位与运算之前,该值首先被符号扩展为int,然后掩码丢弃所有上位比特。我的编辑更详细地显示了这一点。 - mdma
@CheokYanCheng (byte1 & 0xFF) 会从字节中移除任何负数,因为在Java中,byte 只能存储从 -128127 的数字,无法像十六进制中的 255 那样存储一个完整的字节。所以它使得 byte1 的范围从 0255,没有负数。是的,字节无法存储 255,因此您必须将其存储在 shortintlong 中,任何可以至少存储从 0255 的数据类型。 - SSpoke

1

您也可以使用com.google.common.primitives.Shorts,它具有以下方法:

  • public static byte[] toByteArray(short value)
  • public static short fromByteArray(byte[] bytes)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接