作者:拾味湖 | 2023-08-31 10:30
在C++中,我喜欢访问64位无符号整数,via unsigned long long int
或via uint64_t
.现在,在Java中,long是64位,我知道.但是,他们签了名.
是否有一个unsigned long(long)可用作Java原语?我该如何使用它?
1> Amr..:
从Java 8开始,支持无符号长(无符号64位).你可以使用它的方式是:
Long l1 = Long.parseUnsignedLong("17916881237904312345");
要打印它,你不能简单地打印l1,但你必须先:
String l1Str = Long.toUnsignedString(l1)
然后
System.out.println(l1Str);
2> Sean Bright..:
我不相信.一旦你想要超过签名长,我认为BigInteger是唯一(开箱即用)的方式.
这个答案有点过时(它发布于2009年).从Java 8开始(2014年3月发布),支持unsigned long.查看我在下面发布的示例作为答案.
3> Adam Rosenfi..:
不,没有.您必须使用原始long
数据类型并处理签名问题,或使用诸如的类BigInteger
.
4> Paul Tomblin..:
不,没有.Java的设计者正在记录中说他们不喜欢无符号的整数.请改用BigInteger.有关详情,请参阅此问题.
我不尊重戈斯林所做的一切.要说人们不理解未签名的数学?它的签名数学很复杂,特别是在位级别.我不明白为什么人们喜欢Java,因为它是为愚蠢的人写的(也许是计算机科学中最微妙的笑话?).
我尊重戈斯林所做的一切,但我认为他对没有未签名的誓言的辩护是我听过的最愚蠢的借口之一.:-)我们在Java中有更多不稳定的东西而不是无符号的内容...... :-)
@PP.:我希望语言设计者能够认识到区分数字与代数环的重要性("包装整数"类型是什么).任何大小的数字都应该隐式转换为任何大小的环,但是环应该只通过函数或通过显式类型转换为*相同大小*数字转换为数字.C的行为,其中无符号类型通常表现为代数环但有时表现为数字可能是所有可能世界中最差的; 我不能错过Gosling想要避免这种情况,尽管他采取了完全错误的做法.
@PP.:我认为定义合理的规则是不可能的,这些规则允许有符号和无符号类型之间的自由交互,当它们中至少有一个定义了包装行为时.话虽如此,无符号字节或无符号短路会导致*零*故障,因为无论如何字节都不与其他类型交互.更大的问题是为用于表示*数字*的类型定义了包装行为,这与在包装行为实际上有用时为那些罕见情况(如哈希码计算)具有单独的包装类型不同.
5> keelar..:
Java 8提供了一组无符号长操作,允许您直接将那些Long变量视为unsigned Long,这里有一些常用的:
字符串toUnsignedString(long i)
int compareUnsigned(long x,long y)
long dividensnsigned(long dividend,long divisor)
long remainderUnsigned(长股息,长除数)
对于有符号和无符号长整数,加法,减法和乘法是相同的.
快速浏览源代码告诉我对这些方法要谨慎一些.当longs确实是负数时(即与签名的情况存在差异),将使用BigInteger类.这意味着将分配多达8个新BigIntegers,这是相当多的,绝对是性能下降.