2016-08-30 3 views
0

Есть ли опрятный способ создания неподписанной переменной с использованием классов значений scala?Неподписанная переменная с использованием классов значений scala

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

https://github.com/scala/scala.github.com/pull/548 – sjrd

+0

вы хотите что-то вроде этого: 'случай класс Размер (размер: Int) {Защиту без знака = если (размер < 0) - размер другого размера}; Размер (-1) .unsigned // 1' – Samar

+0

Мне это нужно больше, чтобы иметь ошибку, если размер <0, я сделал это так, но я получаю ошибку: этот оператор не допускается в классе значений. 'case class Size (val size: Long) extends AnyVal { if (size <0) throw new IllegalArgumentException; def + (s: Размер): Размер = Размер (размер + s.size) } ' –

ответ

0

Эти факты могут помочь вам понять ваш вопрос. (Для лучшего объяснения, предположим, что все числа 4-бит, без знака диапазоны от [0, 15], подписанный находится в диапазоне от [-8, 7])

  1. В 2-х в дополнение, некоторое число такое же, как -5 и 11 и 27 и так далее, здесь же не только означает, что их представления являются одинаковыми, но и их операции:

    -5 + 10 = 5 
    11 + 10 = 5 
    
  2. Что разница между (не) Подписана и 2 дополнением? (un) подписанный номер должен обрабатывать переполнение, дополнение bu 2 - нет.

    7 + 1 = throw OverflowException 
    -8 - 1 = throw OverflowException 
    
  3. Количество JVM не подписано и не подписано, это 2 дополнение. jvm не вызывает переполнения при срабатывании, поэтому они являются дополнением 2, а не (un) подписанными номерами.

  4. В чем разница между подписанным и неподписанным?

    Они переливаться при различных условиях:

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

    Они напечатаны разные.

Эти факты применяются практически ко всем языкам программирования.

На ваш вопрос, так как вы не обрабатываете переполнение, вам нужно только напечатать его по-другому.

case class Size(val size: Int) extends AnyVal { 
    override def toString = if (size < 0) ... 
} 
Смежные вопросы