gpt4 book ai didi

java - buff.getInt() & 0xffffffffL 是一个恒等式吗?

转载 作者:行者123 更新时间:2023-12-02 05:02:20 24 4
gpt4 key购买 nike

这是我一直在查看的一些代码:

public static long getUnsignedInt(ByteBuffer buff) {
return (long) (buff.getInt() & 0xffffffffL);
}

是否有理由执行 buff.getInt() & 0xffffffffL(0xffffffffL 在 32 个最低有效位中有 32 位 1)?在我看来,结果将始终是 buff.getInt()

最佳答案

简而言之,这是因为该方法需要将 signed int (所有 Java int 都是)转换为 无符号数量。

如果您只是执行(long) buff.getInt(),并且buff.getInt()返回-1,那么您最终会得到-1。这是一个带符号的数量——不是该方法应该返回的数量。

因此,该方法的作用是通过将 int 位与 0x00000000FFFFFFFF 进行 AND 运算,强制 buff.getInt() 变为无符号。这有效地将有符号 int 的位“重新解释”为无符号 int(实际上是有符号 long,但因为只有低 32 位是一旦被设置,它就像一个无符号 int 一样工作,产生所需的结果。

例如,(为简洁起见,使用字节)。

假设 buff.getInt() 实际上是 buff.getByte(),并返回 -1 == 0xFF

尝试将其转换为 int,最终会得到 0xFFFFFFFF - 仍然是 -1,这归因于标志扩展名。

但是,用 0xFF 屏蔽它,最终会得到 0x000000FF == 255 - 所需的值。

相信显式转换是不必要的(它不在我的机器上),但我可能会丢失一些东西......

<小时/>

编辑:事实证明 Actor 阵容实际上是不必要的。来自 JLS 第 5.6.2 节:

加宽基元转换(第 5.1.2 节)适用于按照以下规则指定转换一个或两个操作数:

  • 如果其中一个操作数的类型为 double,则另一个操作数将转换为 double
  • 否则,如果其中一个操作数的类型为 float,则另一个操作数将转换为 float
  • 否则,如果其中一个操作数的类型为 long,则另一个操作数将转换为 long
  • 否则,两个操作数都将转换为 int 类型。

关于java - buff.getInt() & 0xffffffffL 是一个恒等式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23917613/

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