必须使用无符号右移>>>而非>>,因为long是有符号64位整数,>>会符号扩展干扰低位数据,>>>始终补0确保准确提取各字节;循环i从0到7,依次提取下标0(lsb)至7(msb)的8个字节。

可以直接用 for 循环配合右移(>>>)和按位与(& 0xFF)操作,从 long 的低字节开始逐个提取出 8 个 byte。
为什么用无符号右移 >>> 而不是 >>
long 是有符号 64 位整数,高位为 1 时,普通右移 >> 会符号扩展(补 1),干扰低位数据;而 >>> 总是补 0,确保每次移位后只暴露目标字节,不受符号位影响。
提取顺序:从最低字节(index 0)到最高字节(index 7)
一个 long 在内存中按小端惯例(Java 源码视角)可视为 8 个字节,索引 0 对应最低有效字节(LSB),即 value & 0xFF;索引 7 对应最高有效字节(MSB),即 (value >>> 56) & 0xFF。循环中用 i 控制移位位数:i * 8。
- 第 0 次(i=0):取
(value >>> 0) & 0xFF→ 第 0 字节(最低字节) - 第 1 次(i=1):取
(value >>> 8) & 0xFF→ 第 1 字节 - ……
- 第 7 次(i=7):取
(value >>> 56) & 0xFF→ 第 7 字节(最高字节)
标准实现代码(Java 示例)
返回 byte[8],下标 0 是 LSB:
public static byte[] longToBytes(long value) {
byte[] bytes = new byte[8];
for (int i = 0; i >> (i * 8)) & 0xFF);
}
return bytes;
}
说明:
-
(value >>> (i * 8))把目标字节移到最低 8 位 -
& 0xFF清除高位,保留低 8 位(结果是 int 类型的 0~255) -
(byte)强转为 byte —— Java 中 byte 是有符号的,但值范围仍是 0~255 的补码表示(如0xFF转为-1,这是正常且正确的)
验证小技巧:用十六进制辅助理解
例如 long v = 0x123456789ABCDEFL,其字节序(从低到高)为:
[0xEF, 0xCD, 0xAB, 0x98, 0x76, 0x54, 0x32, 0x12]
运行上述循环,bytes[0] 应为 (byte)0xEF(即 -17),bytes[7] 应为 (byte)0x12(即 18)。










