long.tounsignedstring(long value)是java 8引入的将long按64位无符号整数解释并转为十进制字符串的方法,不改变二进制位,仅重解读符号位为数值位,适用于网络协议、哈希值等无符号场景。

关键点:这个方法不会改变原始值的二进制位,只是换一种解读方式——把最高位(bit 63)不再当符号位,而是当作数值的一部分。
什么时候需要使用 toUnsignedString()
当你处理的 long 值实际来源于无符号语义的场景时,比如:
- 从网络协议或文件格式中读取的 64 位无符号整数(如某些 C/C++ 接口传来的 uint64_t)
- 哈希值、UUID 的高位部分、加密运算结果等本就不该有符号含义的数字
- 和 JavaScript(BigInt)、Python(int)、Go(uint64)等语言交互时保持数值一致
对比普通 toString() 的差异
以 `Long.MAX_VALUE + 1L`(即 `-9223372036854775808L`,二进制全为 `1000...000`)为例:
- `String.valueOf(-9223372036854775808L)` → "-9223372036854775808"
- `Long.toUnsignedString(-9223372036854775808L)` → "9223372036854775808"
后者正是把该 long 的 64 位补码形式(`0x8000000000000000`)当作无符号整数解读的结果:2⁶³ = 9223372036854775808。
基本用法与注意事项
- 直接调用即可:
Long.toUnsignedString(0x8000000000000000L)返回"9223372036854775808" - 支持所有 long 值(包括负数),内部自动按无符号逻辑计算,无需手动加 2⁶⁴
- 仅适用于十进制;如需十六进制或二进制无符号表示,用
Long.toUnsignedString(value, radix),radix 可为 2、8、10、16 等 - 底层使用高效的算法(避免大整数运算),性能好于手动转 BigInteger 再 toString()
替代方案(不推荐,仅作理解)
如果你没用 Java 8+,或想理解原理,可等价写成:
-
BigInteger.valueOf(value).add(BigInteger.ONE.shiftLeft(64)).toString()(仅对负值有效,且低效) - 更稳妥的手动处理(兼容所有值):
(value >= 0) ? String.valueOf(value) : String.valueOf((value & 0x7fffffffffffffffL) + 0x8000000000000000L)—— 但易错,没必要
所以,只要环境允许,优先用原生的 Long.toUnsignedString()。










