Scala中的无符号变量

16 java scala

我正在将一些C代码转换为Scala,因为我们正在(据称)进入企业塔中的现代世界,或者我已经被告知了.

一些C代码使用无符号变量,这些变量对它们执行了大量的位级(移位)操作.

我完全停止了如何将这些转换为Scala,因为我相信Scala(和Java)以及JVM确实发现了无符号类型.

任何建议表示赞赏

Dao*_*Wen 22

在C语言和JVM上签名的无符号数学之间的唯一区别是右移运算符.对于无符号数学,您使用逻辑移位(因为您不需要符号扩展),而对于有符号数学,您可以进行算术移位(保留符号).这是二进制补码算法的优点之一.

基于此,您所要做的就是更改>>运算符的Java/Scala 运算>>>符,并逐位获得相同的答案.但是,根据您正在进行的操作,当您尝试对结果执行某些操作时可能仍会出现问题,例如,如果要将其打印为无符号整数.

假设您想在Scala中使用"unsigned"long进行一些数学计算,并在结尾处打印结果.只需使用普通的long,使用>>>(逻辑移位)运算符代替>>,然后将其转换为可以表示无符号值的末尾的其他内容.您可以使用@ rightfold的答案中建议的库,或者您可以执行以下简单的操作:

val x = Long.MaxValue // declare my "unsigned" long
// do some math with it ...
val y = x + 10

// Convert it to the equivalent Scala BigInt
def asUnsigned(unsignedLong: Long) =
  (BigInt(unsignedLong >>> 1) << 1) + (unsignedLong & 1)

x
// Long = 9223372036854775807
asUnsigned(y)
// res1: scala.math.BigInt = 9223372036854775817
Run Code Online (Sandbox Code Playgroud)

如果你只是使用Ints,那么你甚至不必转换到BigInt最后,因为一个Long可以得到答案.只需使用@BrianRoach在上面的评论中建议的方法,通过屏蔽高阶字节将Int's"无符号"值转换为等效值Long.但是,再次,您绝不应该进行转换.即使在64位处理器上使用64位JVM,Long(64位)的整数乘法和除法运算也会比Int(32位)慢.(有关更多详细信息,请参阅此问题:64位整数的效率是否低于JVM中的32位整数?).


rig*_*old 7

遗憾的是,JVM不支持无符号数据类型(此外char,感谢Erwin),但有希望!Scala有一个足够先进的类型系统,允许您创建自己的类型,就像无符号类型一样!

甚至有一个图书馆已经做到了!该库会使运算符超载并提供转换.

  • JVM有一个无符号的16位数据类型:`char`.`char ch = 65535; System.out.println((int)ch);`打印`65535` (7认同)
  • @BrianRoach我知道OP是,但我正在回应右边的声明,即JVM没有无符号数据类型,这是不完全正确的. (2认同)