Scala中的无符号变量

用户名

当我们(按计划)进入Corporate塔中的现代世界时,我正在将一些C代码转换为Scala,或者无论如何我都被告知。

一些C代码使用无符号变量,这些变量具有对其执行的大量位级别(移位)操作。

考虑到我相信Scala(和Java)以及JVM确实都发现了无符号类型外来物,因此我对如何将它们转换为Scala完全停滞不前。

任何建议表示赞赏。

DaoWen

在C和JVM上对无符号数学进行签名之间的唯一区别在于右移运算符。对于无符号数学,请使用逻辑移位(因为您不希望扩展符号),而对于有符号数学,请进行算术移位(保留符号)。这是Two's补码算法的优点之一

基于此,您所要做的就是将Java / Scala>>运算符更改为该运算>>>符,您将得到一点点相同的答案。但是,根据所执行的操作,当您尝试对结果进行某些操作时,例如,如果您想将其打印为无符号整数,可能仍然会遇到问题。

假设您想对Scala中的“无符号”长型进行一些数学运算,并在最后打印结果。只需使用一个普通的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

如果您仅使用Ints,那么您甚至不必BigInt在最后转换为,因为aLong可以容纳答案。只需使用@BrianRoach在上面的评论中建议的方法,即可通过掩蔽高阶字节Int“无符号”值转换为等效值Long但是,同样,除非绝对必要,否则您不应该进行转换。即使在64位处理器上使用64位JVM,Long(64位)整数乘法和除法运算也Int(32位)(有关更多详细信息,请参阅此问题:64位整数的效率是否低于JVM中32位整数的效率?)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

256如何存储在char变量和无符号char中

来自分类Dev

'无符号变量:值'C ++

来自分类Dev

'无符号变量:值'C ++

来自分类Dev

C中的文字和变量(有符号的和无符号的短整数)有什么区别?

来自分类Dev

将正有符号变量替换为无符号变量

来自分类Dev

将无符号整数变量转换为有符号变量

来自分类Dev

@符号在scala中的变量之前是什么意思?

来自分类Dev

Z3无符号变量-简化

来自分类Dev

Z3无符号变量-简化

来自分类Dev

无符号变量发生整数溢出

来自分类Dev

如何在线性规划中制定“无符号变量”?

来自分类Dev

如何找出变量是带符号的还是无符号的

来自分类Dev

关于C中无符号类型的说明

来自分类Dev

C中的无符号位长移位

来自分类Dev

在无符号char数组中存储0

来自分类Dev

C中整数的无符号和后缀

来自分类Dev

C ++中的无符号字符效率低下?

来自分类Dev

在无符号int中存储负数

来自分类Dev

无符号整数在C中溢出

来自分类Dev

Java中无符号右移负数

来自分类Dev

指针忽略了C中的无符号特征?

来自分类Dev

无符号算术运算中的环绕

来自分类Dev

Clojure中的无符号16位整数

来自分类Dev

sqlalchemy 中的无符号浮点数

来自分类Dev

Python中的反向无符号字符

来自分类Dev

存储在 6502 内存中的字节是有符号的还是无符号的?

来自分类Dev

类型转换为无符号char并乘以变量

来自分类Dev

如何检查本身是无符号变量的负数(通过用户输入)?

来自分类Dev

无符号变量的默认值是多少?