Как добавить 1 к байту - PullRequest
5 голосов
/ 11 июля 2011

Я пытался

 module Program
 {
  Main() : void
  { mutable x : byte = 0B;
    mutable y : byte = 0B;  
    x++;
    //y = x + 1;
    //y = x + 1B;
    //def one:byte=1;//   x = x + one;
  }
 }

Независимо от того, что я пробую, я получаю следующее сообщение об ошибке.

Ошибка 1, ожидаемый байт, получил int в присвоенном значении:System.Int32 не является подтипом System.Byte [простое требование]

Единственный способ, с помощью которого я обнаружил, работает:

    y = ( x + 1 ):>byte

Это немного ошибочно, простодобавить один.

Почему это?и есть ли лучше (читай более коротким способом)?

Ответы [ 4 ]

8 голосов
/ 11 июля 2011

Как и в C #, результатом суммы byte и byte в Nemerle является int.Однако, в отличие от C #, Nemerle старается сохранить базовый язык настолько компактным, насколько это возможно, сохраняя весь синтаксический сахар в стандартной библиотеке макросов.В этом духе операторы += и ++ - это макросы, которые переводятся в обычное сложение.

Чтобы ответить на ваш вопрос, (x + 1) :> byte - способ сделать это.Это на самом деле не так уж и плохо, потому что он позволяет читателю вашего кода знать, что вы знаете об опасности переполнения и берете на себя ответственность за него.ваши собственные макросы += и ++ для выполнения приведения.Это займет всего несколько строк кода.

2 голосов
/ 11 июля 2011

Это потому, что CLR определяет только ограниченное количество допустимых операндов для инструкции Add IL. Допустимые значения: Int32, Int64, Single и Double. Также IntPtr, но это, как правило, отключается во многих языках.

Таким образом, добавление константы в байт требует, чтобы байт был сначала преобразован в Int32. Результатом добавления является Int32. Который не вписывается обратно в байт. Если вы не используете больший молоток. В остальном это здорово, вероятность того, что вы переполните Byte.MaxValue, довольно велика.

Обратите внимание, что есть языки, которые автоматически приводятся, VB.NET является одним из них. Но он также автоматически генерирует OverflowException. Очевидно, что не тот, который вы используете, ни C #. Это лучший выбор, тест на переполнение не так уж и дешев.

2 голосов
/ 11 июля 2011

Отказ от ответственности: я не знаю Nemerle, но я предполагаю, что в этом отношении он ведет себя подобно C #.

Есть лучший и короткий путь: не используйте байты.

Почему вы используете их в первую очередь? В большинстве случаев вычисления с int с выполняются быстрее, чем с byte с, потому что современные компьютеры оптимизированы для них.

0 голосов
/ 11 июля 2011

Это то, что делает система типов. Добавляет значения до целых, а затем выполняет операцию, результатом которой является int. Также подумал, что должно произойти, если начальное значение было 255?

...