为什么Java不支持unsigned int?
为什么Java不包含对无符号整数的支持?
在我看来,这是一个奇怪的遗漏,因为它们允许编写不太可能在意外大的输入上产生溢出的代码。
此外,使用无符号整数可以是一种自我记录的形式,因为它们表明无符号整数打算保存的值从不应该是负数。
最后,在某些情况下,无符号整数可以更有效地执行某些操作,例如除法。
包括这些的缺点是什么?
这来自对高斯林和其他人的采访,关于简单性:
Gosling:对于我来说,作为一名语言设计师,我现在并不认为自己真的是那么简单,但真正意义上的“简单”意味着什么,我可以期待J.Random Developer能够在他的脑海中保持这个规范。 这个定义说,例如,Java不是 - 事实上,很多这些语言最终都会遇到很多角落案例,这些都是没有人真正理解的。 测验任何C开发者关于未签名的,很快你会发现几乎没有C开发人员真正理解什么是无符号的,什么是无符号算术。 像这样的事情使C复杂。 我认为Java的语言部分非常简单。 你必须查找库。
在线条之间阅读,我认为逻辑是这样的:
大多数情况下,我会说这是一个合理的决定。 可能的话,我会:
尽管如此,对于高达32位的无符号值的操作并不算太糟,大多数人不需要无符号的64位除法或比较。
这是一个较老的问题,拍拍简单地提到了char,我只是认为我应该扩大这个对于其他人来看这个道路。 让我们仔细看看Java基本类型:
byte
- 8位有符号整数
short
16位有符号整数
int
- 32位有符号整数
long
- 64位有符号整数
char
- 16位字符(无符号整数)
虽然char
不支持unsigned
算术,但它本质上可以视为unsigned
整数。 您必须将算术运算明确地转换回char
,但它确实为您提供了指定unsigned
数字的方法。
char a = 0;
char b = 6;
a += 1;
a = (char) (a * b);
a = (char) (a + b);
a = (char) (a - 16);
b = (char) (b % 3);
b = (char) (b / a);
//a = -1; // Generates complier error, must be cast to char
System.out.println(a); // Prints ?
System.out.println((int) a); // Prints 65532
System.out.println((short) a); // Prints -4
short c = -4;
System.out.println((int) c); // Prints -4, notice the difference with char
a *= 2;
a -= 6;
a /= 3;
a %= 7;
a++;
a--;
是的,没有对无符号整数的直接支持(显然,如果有直接支持,我不必将大部分操作转换回char)。 但是,肯定存在无符号的原始数据类型。 我希望看到一个无符号的字节,但我猜想内存开销增加了一倍,而使用char是一个可行的选择。
编辑
在JDK8中, Long
和Integer
提供了新的API,它们在将long
和int
值视为无符号值时提供了辅助方法。
compareUnsigned
divideUnsigned
parseUnsignedInt
parseUnsignedLong
remainderUnsigned
toUnsignedLong
toUnsignedString
此外,Guava提供了许多帮助器方法来为整数类型做类似的事情,这有助于缩小缺少对unsigned
整数的本机支持所留下的空白。