Luk*_*der 31 java unsigned numbers
显然,Java本身不支持无符号数字类型,并且不会很快改变(从2002年开始的评论).但是,在使用MySQL等数据库时,它们可能会偶尔派上用场.有很多问题涉及如何模拟无符号数.例如:
所有这些肤浅描述它是如何能做到.但是它有什么实际图书馆去所有的方式和实施适当的包装UByte,UShort,UInteger,ULong?优选地,那些包装器将延伸java.lang.Number并提供类似于其的算术API java.math.BigInteger.
从本文档中可以看出,有很多需要考虑的问题,以及可能出错的问题(例如,如何按位移位,如何乘法等),所以我不想自己做.此外,我不想只使用下一个更高的类型(例如,Short而不是Byte等).我想的概念8-bit,16-bit,32-bit,64-bit号码保留,与数据库提供最好的交互,例如.
更新:
在你回答之前!考虑一下我知道所有的解决方法,但我真的很想拥有具有上述属性的4种类型.也许有人已经这样做了,所以这就是我问的原因.无需提醒我解决方法.
A.H*_*.H. 20
有些原因导致没有人按照您想要的方式创建这些包装器.
前面四点由一个小C示例说明:
unsigned int x=42, y, m=5, t=18;
y = x * m + t;
Run Code Online (Sandbox Code Playgroud)
这将被翻译成:
UInteger m = new UInteger(5);
UInteger t = new UInteger(18);
UInteger x = new UInteger(42);
UInteger y = x.multiplyBy(m);
y = y.add(t);
Run Code Online (Sandbox Code Playgroud)
必须创建几个包装器对象,multiplyBy并add生成更多.如果以这种方式进行许多计算,这将给垃圾收集器带来相当大的负担.包装和展开也会耗尽你的CPU.
即便是简单的算术也是PITA的写入或读取也很明显.
出于同样的原因,NOBODY使用签名的包装器类型进行算术运算.
如果您使用下一个更大的签名类型进行计算并切断上半部分,则所有这些都是不必要的:
long x=42, y, m=5, t=18
y = (x*m + t) & 0xFFFFFFFF;
Run Code Online (Sandbox Code Playgroud)
Java和数据库之间的转换也可以使用下一个最大的签名类型完成.由于JDBC不会创建这些未签名的包装器类型,因此您必须自己完成此操作,以便此后将数据转换为无符号包装器.
我为自己完成了一些CPU密集型数据处理并处理了二进制协议.在这些场合,我希望我也有未签名的数据类型.但是使用包装器类型在Java中模拟它们比在每个场合直接处理问题更成问题.