Java是出于什么考虑不设计无符号整型的?

有时候和其它语言交互,无符号整型会方便很多。Java是出于什么考虑不设计无符号整型的呢?Java8虽然增加了几个无符号整型的静态方法,但是还是不能像原…
关注者
66
被浏览
43,633

11 个回答

刚学Java的时候也很怀疑没有无符号数有多别扭, 现在已经用很久Java了, 感觉无符号数真的用处很少.

如果只表示正数, 相同的32/64位整数, 无符号数只多了一位有效位数并不明显, 一般用int/long都不会超过31/63位, 如果有需求正好超过31位,还不超过32位, 那真是太少见了, 这种情况我觉得还是多考虑一下是不是32位也不够用,还是改成long好了. 用满64位的需求更少见,此时就要考虑是不是要用BigInteger了.

如果执意要用无符号数, 那Java也不妨碍什么, 尽管用相同位数的有符号类型好了, 加减法,左移,位运算都不影响, 右移有专门的无符号右移, 乘除法Integer/Long类里有专门的无符号计算方法,无符号比较也有compareUnsigned方法,转成字符串也有toUnsignedString方法,反过来转换也有parseUnsignedXXX方法,而且这些方法大多都能JIT成高效的CPU指令. 唯一要注意的就是从低到高位数的类型转换时要避免符号位的扩展.

如果像C/C++/C#那样自带了无符号类型, 也会带来一些麻烦, 我就经常遇到有符号和无符号的混合计算/比较, 让人纠结给非负值变量定义类型时尽量偏向无符号还是有符号, 最后索性跟Java一样尽量都用有符号就省心多了, 我看很多库即使不会出现负数也习惯用int而不是unsigned int(如C#容器的Count/Length属性).

因为 Java是设计给猴子用的,为了尽可能简化学习成本(因为这些互相cast会很扯),就没加这些。


实际上后来的版本加了,只是没专门整这个类型而已。

更新:评论区人才辈出