gpt4 book ai didi

java - 在 java 中初始化字节数组时,什么时候必须转换为字节?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:08:35 29 4
gpt4 key购买 nike

代码如下:

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();
}

}
}

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

Error:(194, 45) java: incompatible types: possible lossy conversion from int to byte

为什么?

最佳答案

0xff不在 byte 中可表示数字的范围内类型。 byte 中的最大值是127 0xff在哪里代表255 .因此,在这种情况下您需要类型转换。

当数字可表示时,例如在您分配 0x6c 的第一种情况下在应用来自 int 的缩小转换后,Java 编译器接受它而不进行强制转换至 byte .

integer值缩小为 byte ,除目标类型可表示的最低位外,所有位都被丢弃。这意味着对于整数 0xff这是00000000000000000000000011111111 , 取最低 8 位,得到字节 11111111这是-1 .因此,转换改变了初始数字的值符号。

关于java - 在 java 中初始化字节数组时,什么时候必须转换为字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30818758/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com