Java不支持无符号整数,但是如果您将long
视为无符号整数,则可以很好地进行乘法。
但是,设置从2^63+1
到2^64-1
long
的最佳方法是什么?
Long.MAX_VALUE
是0x7fffffffffffffffL
;
我知道的唯一方法是
long maximumUnsigned = new BigInteger("18446744073709551615").longValue()
(18446744073709551615 = 2^64-1
在哪里)
这样做long maximumUnsigned = -1
也可以,但我发现这有问题,可能会欺骗读者认为这是负面的。
似乎没有完美的解决方案。因为,正如你所说,Long.MAX_VALUE
是0x7fffffffffffffffL
,我想我也会在第一个位置放一个F
:
long maxUnsignedLong = 0xFFFF_FFFF_FFFF_FFFFL;
System.out.println(Long.toUnsignedString(maxUnsignedLong));
输出:
18446744073709551615
优势:
- 对于知道
long
是 64 位并且熟悉十六进制数字的读者来说,它比18446744073709551615更容易阅读。 - 它不会给读者这样的印象,即这个数字应该被理解为负数(不管Jon Skeet当然是正确的,它是负数)。