У меня возникла небольшая проблема при попытке преобразовать некоторую логику 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?
~(byte)w
не то же самое, что(byte)~w
. - person aevitas   schedule 24.03.2014~
. В частности: Операции побитового дополнения предопределены для int, uint, long и ulong. - person Matt Burland   schedule 24.03.2014