Java缺乏无符号原始类型是Java平台还是Java语言的特征?

10

有关Java为什么不支持无符号类型的问题以及一些处理无符号类型的问题。我进行了一些搜索,似乎Scala也不支持无符号数据类型。这个限制是在Java和Scala语言设计中,生成的字节码中还是在JVM本身中?是否可能存在一种在JVM上运行并且与Java(或Scala)完全相同的语言,但支持无符号原始数据类型?

4个回答

10

Java字节码规范仅定义了有符号类型

整数类型包括byte、short、int和long,它们的值为8位、16位、32位和64位的有符号二进制补码整数

但是在JVM上实现的语言可能可以在语法级别上添加无符号类型,并在编译阶段处理转换。


我甚至从未想过查看字节码规范。我应该这样做。我只看了Java语言规范和各种Scala文档。 - Thomas Owens
内置的整数运算符没有以任何方式指示(正或负)溢出;在溢出时它们会绕回。这也表明,如果您正确处理情况,确实可以使用标准算术运算符实现无符号数据类型。 - Thomas Owens
从前我曾经使用过QuickTime Java API,它只是一个包装本地QuickTime库的包装器。如果我没记错的话,这个库充满了无符号整数类型。虽然API有些笨拙,但有符号和无符号之间的转换还是可以正常工作的。 - Dmitry B.
Java的非扩展移位运算符“>>>”对应于C中无符号类型的“>>”。它通过字节码指令“iushr”实现32位宽值和64位宽值的“lushr”。这些指令名称中的“u”代表“无符号”。 - Mike Samuel

2
尽管无符号类型可以在字节码级别上进行模拟,但这样做存在一些缺点:
  • 性能问题:每个简单算术操作都需要多个字节码操作。使用模拟无符号类型的代码性能将比使用有符号类型的代码差两到三倍。

  • 兼容性问题:大多数在JVM上运行的语言都非常努力地与现有的大量Java代码兼容。当引入附加类型或需要以不同方式处理某些“已知”类型的变量时,这种兼容性会立即受到破坏。

考虑到这些问题,我认为无符号类型的好处微乎其微。


相同大小的数字的加减不会受影响。比较可能是最大的麻烦。 - supercat
@supercat: 你为什么这样认为? - A.H.
1
我能想到的唯一受影响的操作是除法、比较和转换为long或浮点类型。其中,比较会比其他操作更频繁地使用,并且通常需要最少的时间。 - supercat
2
无符号类型的好处不可忽视。在JVM上支持定点数值和系统编程互操作性需要进行各种各样的技巧。 - ctpenrose

0

Eta 在 JVM 上支持无符号类型。


0
处理无符号算术是一种语言/实现问题,而不是平台问题 -- 即使没有原生支持,它也可以在任何平台上模拟。
JVM并没有将其作为一种类型,除了'char',这是一个无符号的16位值,所以Java/Scala等不会“开箱即用”地支持它。

正确答案被踩需要解释。 - Dave Newton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接