为什么Java不支持unsigned int?

为什么Java不包含对无符号整数的支持?

在我看来,这是一个奇怪的遗漏,因为它们允许编写不太可能在意外大的输入上产生溢出的代码。

此外,使用无符号整数可以是一种自我记录的形式,因为它们表明无符号整数打算保存的值从不应该是负数。

最后,在某些情况下,无符号整数可以更有效地执行某些操作,例如除法。

包括这些的缺点是什么?


这来自对高斯林和其他人的采访,关于简单性:

Gosling:对于我来说,作为一名语言设计师,我现在并不认为自己真的是那么简单,但真正意义上的“简单”意味着什么,我可以期待J.Random Developer能够在他的脑海中保持这个规范。 这个定义说,例如,Java不是 - 事实上,很多这些语言最终都会遇到很多角落案例,这些都是没有人真正理解的。 测验任何C开发者关于未签名的,很快你会发现几乎没有C开发人员真正理解什么是无符号的,什么是无符号算术。 像这样的事情使C复杂。 我认为Java的语言部分非常简单。 你必须查找库。


在线条之间阅读,我认为逻辑是这样的:

  • 一般来说,Java设计人员希望简化可用数据类型的库
  • 对于日常用途,他们认为最常见的需求是签名数据类型
  • 为了实现某些算法,有时需要无符号算术,但是实现这种算法的程序员也可以具有“循环工作”的能力,对签名数据类型进行无符号算术
  • 大多数情况下,我会说这是一个合理的决定。 可能的话,我会:

  • 使字节无符号,或者至少为这一种数据类型提供了签名/未签名的替代品(可能具有不同的名称)(使其签名有利于一致性,但是何时需要签名字节?)
  • “短”(你上次什么时候使用16位有符号算术?)
  • 尽管如此,对于高达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中, LongInteger提供了新的API,它们在将longint值视为无符号值时提供了辅助方法。

  • compareUnsigned
  • divideUnsigned
  • parseUnsignedInt
  • parseUnsignedLong
  • remainderUnsigned
  • toUnsignedLong
  • toUnsignedString
  • 此外,Guava提供了许多帮助器方法来为整数类型做类似的事情,这有助于缩小缺少对unsigned整数的本机支持所留下的空白。

    链接地址: http://www.djcxy.com/p/73637.html

    上一篇: Why doesn't Java support unsigned ints?

    下一篇: Varying behavior for possible loss of precision