我正在研究 java.io
的 DataInputStream.readLong()
在se6中:
private byte readBuffer[] = new byte[8];
public final long readLong() throws IOException {
readFully(readBuffer, 0, 8);
return (((long)readBuffer[0] << 56) +
((long)(readBuffer[1] & 255) << 48) +
((long)(readBuffer[2] & 255) << 40) +
((long)(readBuffer[3] & 255) << 32) +
((long)(readBuffer[4] & 255) << 24) +
((readBuffer[5] & 255) << 16) +
((readBuffer[6] & 255) << 8) +
((readBuffer[7] & 255) << 0));
既然readbuffer[]是一个字节数组,为什么需要 &
每个字节有255?
将单个字节转换为 long
,是否应该将long的剩余位(9-64)自动设置为零,从而呈现 &
不必要?
2条答案
按热度按时间t9eec4r01#
防止带负值字节的符号扩展。
ogsagwnx2#
java的字节类型是有符号的,所以0xff(255)==-1,在从byte扩展到int/long的过程中,有符号的值被保留,所以如果您只有代码:
所以,这里有一个窍门:
因此,由于符号扩展,第一个字节变量a被提升为int(并成为0xffffff),然后我们通过按位and来截断它