代码之家  ›  专栏  ›  技术社区  ›  DaveJohnston

将int隐式转换为字节

  •  9
  • DaveJohnston  · 技术社区  · 15 年前

    我将开始处理一些需要读取字节和创建字符串的事情。正在读取的字节表示UTF-16字符串。所以为了测试一下,我想把一个简单的UTF-16编码的字节数组转换成一个字符串。数组中的前2个字节必须表示Endianness,因此必须是0xff 0xfe或0xfe 0xff。所以我尝试创建字节数组,如下所示:

    byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00};
    

    但是我得到了一个错误,因为0xFF和0xFE太大,不能适应一个字节(因为字节是用Java签名的)。更准确地说,错误是无法将int转换为字节。我知道我可以通过一个强制转换将int显式转换为byte并获得所需的结果,但这不是我的问题所在。

    为了尝试一些方法,我创建了一个字符串,名为getbytes(“utf-16”),然后打印数组中的每个字节。输出有点混乱,因为前两个字节是0xfffffffe 0xffffffff,后面是0x00 0x52 0x00 0x6f。(显然,这里的endianness与我在上面尝试创建的不同,但这并不重要)。

    使用此输出,我决定尝试以相同的方式创建字节数组:

    byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00};
    

    奇怪的是,它工作得很好。所以我的问题是,为什么Java允许一个0xFFFFF80或更大的整数值自动转换成一个没有显式CAST的字节,但是任何等于或大于0x80的东西都需要一个显式的CAST?

    5 回复  |  直到 15 年前
        1
  •  10
  •   skaffman    15 年前

    这里要记住的关键是 int 在Java中是一个带符号的值。当你分配 0xffffffff (这是 2^32 -1 ,这将转换为有符号的int值。 -1 -安 利息 实际上不能表示像 0xFFFFFFFF 作为正数。

    因此,对于小于0x80和大于0xffff80的值,结果 int 值介于-128和127之间,可以明确表示为 byte . 该范围之外的任何内容都不能,需要使用显式强制转换,从而在进程中丢失数据。

        2
  •  2
  •   tangens    15 年前

    如果使用一个没有提示的数字(例如,1234L表示长),编译器将假定一个整数。价值 0xffffffff 是带值的整数 -1 可以铸造成 byte 没有警告。

        3
  •  0
  •   Confusion    15 年前

    因为0xffffffff是数字-1,-1可以解释为字节。

        4
  •  0
  •   T.J. Crowder    15 年前

    0xff 和写作一样 0x000000ff 不是 0xffffffff . 所以这就是您的问题;整数是一个正数(255),但是字节(如果按位转换)将是一个负数(-1)。但是 0xFFFFFFFF 都是-1 int 作为一个 byte .

        5
  •  0
  •   Patrick    15 年前

    因为int是有符号的,而0xffffff表示-1,而0xff表示值255的整数,它不在字节的-128(0x80)+127(0x7f)范围内。