是Java';缺少无符号原语类型是Java平台还是Java语言的特点?

是Java';缺少无符号原语类型是Java平台还是Java语言的特点?,java,types,language-design,unsigned,Java,Types,Language Design,Unsigned,这里有关于和一些关于处理无符号类型的问题。我做了一些搜索,Scala似乎也不支持无符号数据类型。Java和Scala语言设计中的限制是在生成的字节码中,还是在JVM本身中?是否有某种语言在JVM上运行,在其他方面与Java(或Scala)相同,但支持未签名的基本数据类型?Java字节码规范: 整数类型为byte、short、int和long,其值为 8位、16位、32位和64位带符号2的补码整数 但是,在JVM之上实现的语言可能会在语法级别添加一个无符号类型,而只是在编译阶段处理转换。处理无符号

这里有关于和一些关于处理无符号类型的问题。我做了一些搜索,Scala似乎也不支持无符号数据类型。Java和Scala语言设计中的限制是在生成的字节码中,还是在JVM本身中?是否有某种语言在JVM上运行,在其他方面与Java(或Scala)相同,但支持未签名的基本数据类型?

Java字节码规范:

整数类型为byte、short、int和long,其值为 8位、16位、32位和64位带符号2的补码整数


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

处理无符号算术是一个语言/实现问题,而不是平台问题——即使没有本机支持,也可以在任何平台上模拟它


JVM没有将其作为类型,除了“char”(一个16位的无符号值)之外,因此Java/Scala/等不支持“开箱即用”。

尽管可以在字节码级别模拟无符号类型,但这有一些缺点:

  • 性能:每个简单的算术运算都需要几个字节码运算。使用模拟无符号类型的代码的性能将比使用有符号类型的代码差两到三倍

  • 兼容性:在JVM上运行的大多数语言都非常努力地与大量Java代码兼容。当然,如果引入了其他类型,或者某些具有“已知”类型的变量必须进行不同的处理,那么这一点就会立即被破坏


有鉴于此,未签名类型的好处几乎可以忽略不计。

在JVM上支持未签名类型。

我甚至从来没有想过要查看字节码规范。我应该这样做。我只看了Java语言规范和各种Scala文档。“内置的整数运算符不会以任何方式指示(正或负)溢出;它们在溢出时环绕。”这也表明如果您正确处理这些情况,您确实可以使用标准算术运算符实现无符号数据类型。早在我使用QuckTime Java api的那一天,它只是本地QuickTime库的一个包装器,如果我没有记错的话,它充满了无符号整数类型。这在api方面有点笨拙,但有符号-无符号转换工作正常。Java的非扩展移位运算符
>>
对应于C的
>
无符号类型。对于32b宽的值,通过字节码指令
iushr
实现;对于64b宽的值,通过字节码指令
lushr
实现。这些指令名中的“u”代表“unsigned”。大小相同的数字的加减不会受到影响。比较可能是最大的麻烦。@supercat:你为什么这么认为?我能想到的唯一会受到影响的操作是除法、比较和到
long
或浮点类型的转换。在这些类型中,比较将比其他类型更频繁地使用,并且通常花费的时间最少。无符号类型的好处不容忽视。为了支持JVM上的定点数值运算和系统编程互操作性,需要做各种各样的练习。对正确答案的否决值得解释。