DataOutputSteam的writeInt为什么要这么实现呢?

看thingking in java的IO部分时提到了DataOutputSteam, 于是查看了一下源码, 发现DataOutputStream在实现writeLong, writeInt ,writeChar和writeShort都采用了这种方法实现:

public final void writeChar(int v) throws IOException {
    out.write((v >>> 8) & 0xFF);
    out.write((v >>> 0) & 0xFF);
    incCount(2);
}

public final void writeInt(int v) throws IOException {
    out.write((v >>> 24) & 0xFF);
    out.write((v >>> 16) & 0xFF);
    out.write((v >>>  8) & 0xFF);
    out.write((v >>>  0) & 0xFF);
    incCount(4);
}

public final void writeLong(long v) throws IOException {
    writeBuffer[0] = (byte)(v >>> 56);
    writeBuffer[1] = (byte)(v >>> 48);
    writeBuffer[2] = (byte)(v >>> 40);
    writeBuffer[3] = (byte)(v >>> 32);
    writeBuffer[4] = (byte)(v >>> 24);
    writeBuffer[5] = (byte)(v >>> 16);
    writeBuffer[6] = (byte)(v >>>  8);
    writeBuffer[7] = (byte)(v >>>  0);
    out.write(writeBuffer, 0, 8);
    incCount(8);
}

我想知道的是为什么要先无符号右移,然后和00ff进行与运算呢?

阅读 2.9k
1 个回答

首先 >>> 是无符号右移,右移过程中左侧只填充 0 ,和符号位无关。
这里代码这样写,应该是为了保障代码的可读性,表示实际写入的是右移后的其中八位。在 write 方法中,已经保障了只写入低八位,所以这段 & 0xFF 的运算和用 >>> 还是 >> 其实是无关紧要的。不过就像复杂的表达式即使没有必要使用括号,也最好使用括号的道理一样,这里应该是为了方便阅读者不误解实际操作的意义。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题