Обработка байтов C#

У меня возникла небольшая проблема при попытке преобразовать некоторую логику VB6 в C#. В одной из функций VB6 он имеет следующий оператор:

w = Not CByte(w)

Где w - это long.

В примере, после того как эта строка оценивается в VB6, я вижу следующее изменение:
Before: w = 110
After: w = 145

Однако в C# я переписал метод, чтобы он содержал следующий код:

w = ~(byte)w;

Но когда я запускаю тот же пример, вместо этого я получаю следующие результаты:
Before: w = 110
After: w = -111

Я также получаю тот же результат:

w = ~(Convert.ToByte(w));

Наконец-то я смог получить правильные результаты со следующим изменением:

w = ~(byte)w & 0xFF;

Из того, что я могу сказать, похоже, что С# преобразует его в sbyte, хотя это не указано. Мой вопрос: есть ли какой-то изъян в моей логике? Это единственный способ получить эквивалент VB6?


person Siyual    schedule 24.03.2014    source источник
comment
Ваша проблема заключается в том, что ваше предположение о том, когда происходит арифметическая операция, неверно. ~(byte)w не то же самое, что (byte)~w.   -  person aevitas    schedule 24.03.2014
comment
См. MSDN для оператора ~. В частности: Операции побитового дополнения предопределены для int, uint, long и ulong.   -  person Matt Burland    schedule 24.03.2014


Ответы (1)


w — это long, но допустим, что это int, это не имеет большого значения, разве что его немного легче объяснить.

w = ~(byte)w;

Итак, w приводится к byte .. а затем сразу же возвращается к int, потому что это то, что делают арифметические операции.

Вы можете решить эту проблему, приняв предложение Джастина из комментариев (что делает актерский состав в нужный момент: (byte)~w) или с помощью этого:

w ^= 0xFF;

Хотя это не совсем то же самое, это другое, если w начинается со значения, выходящего за пределы диапазона byte.

person harold    schedule 24.03.2014
comment
Идеальный! Это имеет большой смысл - отличное объяснение. Спасибо! - person Siyual; 24.03.2014