使用scala值类的无符号变量

时间:2016-08-30 08:45:01

标签: scala

是否有一种使用scala值类创建无符号变量的简洁方法?

case class Size(val size: Int) extends AnyVal {
 ....
   }

1 个答案:

答案 0 :(得分:0)

这些事实可以帮助您理解您的问题。 (为了更好地解释,假设所有数字都是4位,无符号范围来自[0,15],有符号范围来自[-8,7])

  1. 在2的补码中,有些数字相同,如-5和11和27等等,这里的SAME不仅意味着它们的表示相同,而且还表示它们的操作:

    -5 + 10 = 5
    11 + 10 = 5
    
  2. (un)签名和2&2补充之间的区别是什么? (un)签名号码应该处理溢出,bu 2的补码不会。

     7 + 1 = throw OverflowException
    -8 - 1 = throw OverflowException
    
  3. jvm的数量既不是有符号也不是无符号,它是2的补码。 jvm在触发时不会抛出任何溢出,因此它们是2的补码,而不是(未)签名的数字。

  4. 签名和未签名之间的区别是什么?

    它们在不同条件下溢出:

                 Signed           Unsigned
         7 + 1  overflow             8
     -8(7) - 1  underflow            6
         0 - 1     -1            underflow
    -1(15) + 1      0            overflow
    

    它们的印刷方式不同。

  5. 这些事实几乎适用于所有编程语言。

    回到你的问题,因为你不会处理溢出,你唯一需要做的就是以不同的方式打印它。

    case class Size(val size: Int) extends AnyVal {
      override def toString = if (size < 0) ...
    }