在java中初始化字节数组时,何时必须转换为字节?

qed*_*qed 3 java arrays int byte type-conversion

这是代码:

import java.io.*;

public class Bed {
    private String bedfn;
    private int bytes_snp;
    private int nindiv;
    private long bedsize;
    private int nsnp;
    private byte[] magicBytes;

    public Bed(String bedfn, int bytes_snp, int nindiv) {
        this.bedfn = bedfn;
        this.bytes_snp = bytes_snp;
        this.nindiv = nindiv;
        bedsize = (new File(bedfn)).length();
        nsnp = (int) ((bedsize - 3) / bytes_snp);
        ///////////////////////////////////////
        magicBytes = new byte[] {0x6c, 0x1b, 0x01};
    }

    //...

    public OutputStream writeBytes(OutputStream fileStream, byte[] bytes) {
        try{
            fileStream.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileStream;
    }

    public OutputStream writeBytes(OutputStream fileStream) {
        return writeBytes(fileStream, magicBytes);
    }

    public OutputStream writeBytes(String filename, byte[] bytes) throws FileNotFoundException {
        FileOutputStream fileOutputStream = new FileOutputStream(filename);
        BufferedOutputStream fileBufferedOutput = new BufferedOutputStream(fileOutputStream);
        return writeBytes(fileBufferedOutput, bytes);
    }


    public OutputStream writeBytes(String filename) throws FileNotFoundException {
        return writeBytes(filename, magicBytes);
    }




    public static void main(String[] args) throws IOException {
        String filename = "/Users/kaiyin/personal_config_bin_files/workspace/rbed2/inst/extdata/test.bed";
        Bed bedobj = new Bed(filename, 2, 6);

        OutputStream outputStream = bedobj.writeBytes("/tmp/x.bed");
        try{
            ///////////////////////////////////////
            outputStream.write(new byte[] {(byte) 0xff, (byte) 0xff});
        } finally {
            outputStream.close();
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

有两个字节数组初始化(标有///////),在第一个我没有强制转换,在第二个我必须,否则我得到这个错误:

Error:(194, 45) java: incompatible types: possible lossy conversion from int to byte
Run Code Online (Sandbox Code Playgroud)

为什么?

man*_*uti 5

0xff不适合byte类型中可表示的数字范围.适合的最大值byte127其中的0xff代表255.因此,在这种情况下你需要一个演员表.

当数可表示,例如在第一种情况下,你指定0x6cJava编译器接受它,而不从应用收缩转换后获得的铸造intbyte.

当该integer值缩小到a时byte,除了目标类型可表示的最低位之外的所有位都被丢弃.这意味着,对于该整数0xff00000000000000000000000011111111,最低的8位被采取,在字节resuling 11111111这是-1.因此,转换更改了初始数字的值符号.