【发布时间】:2015-03-17 21:41:51
【问题描述】:
我正在编写与硬件和数学相关的代码,并广泛使用 32 位和 64 位无符号整数值。如果没有任何 javac 支持,错误一直很稳定且难以解决。 Java 8 在盒装的 Long 类上添加了一些用于除法、模数和比较的函数,但是虽然这些函数提供了运行时支持,但由于无意混合两者而缺乏编译时警告,这让我想把头发拉出来.
有没有人知道有什么方法可以帮助解决这些问题? Java 团队的一位成员提到了possible annotation support 进行类型检查。
到目前为止,我在所有无符号变量前加上 u_,我什至尝试在每次出现应该无符号的 int 或 long 之前添加 /* unsigned */ 注释。虽然这些很有用,但它们也非常混乱。它还不够远。犯错的机会太多了。
两个较大的问题是不需要的符号扩展和混合操作。
像/* unsigned */ long u_lowmask = 0xffffffff 这样无害的东西并没有得到想要的结果,甚至只是/* unsigned */ long u_widen64 = small32 用那个无声的扩展名破坏了事情。在其他语言中,我可以从编译器或类似 Lint 的静态检查器中获得警告。函数式语言通常将其构建到类型检查机制中,但 Java 避开了这些,转而支持其他解决方案。混合比较或操作的机会太多了。
任何想法都应该不会对运行时产生影响,所以我不能将 unsigned 包装在一个类或 bignums 中。好吧,如果我可以在没有任何分配或线程局部变量的费用的情况下侥幸完成它,我也许可以将它们包装在一个类中,但这可能会使代码不可重入。此外,Hotspot 还必须能够为接近于简单本机的包装无符号整数发出代码。 (实际上,我认为 Hotspot 可能足够聪明,可以接近 - 可能需要额外的内存读写。)
其他人如何围绕这个问题进行编码?
【问题讨论】:
-
重写以删除对库或工具的任何引用。
-
我认为,基于注释的解决方案将是最干净的,但目前还没有合适的检查工具。
标签: java annotations java-8 unsigned