Восьмеричное значение выдает ошибку компилятора, а константа - нет, и они имеют одинаковые значения - PullRequest
0 голосов
/ 12 августа 2011

Это один из тех, почему так происходит вопросы.Мне нужно взять значение Int32 и «ИЛИ» его с минимальным значением его типа (в результате переноса 10-летнего приложения VBA).

Это приводит к поломке компилятора с предупреждением и ошибкой,сначала код, который ломается, затем код, который работает, а затем сообщение об ошибке.

ломает компилятор (пожалуйста, игнорируйте имя переменной, тип VBA длинный и я использую Int32):

UInt32Val = UInt32Val | 0x80000000;

Это не нарушает компилятор:

UInt32Val = UInt32Val | Int32.MinValue;

Я получаю следующие ошибки:

  1. Побитовый оператор или оператор, используемый в операнде с расширенным знаком;сначала рассмотрите приведение к меньшему типу без знака
  2. Невозможно неявно преобразовать тип 'long' в 'int'.Существует явное преобразование (вам не хватает приведения?)

Насколько я понимаю, значения 0x80000000 и Int32.MinValue равны -2147483648.

Моя большая проблема с этим портом заключается в том, чтоприложение VBA использует long и int, которые переводятся в .NET как Int32 и Int16 соответственно, и происходит много сдвигов и обмена битами.

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

Во всяком случае, концептуально, я скрываю проблему, если я могу исправить проблему компилятора путем замены исходного восьмеричного значения на константу?Я собираюсь запустить оба приложения и начать сравнивать значения, но я действительно хочу понять, что здесь происходит.

Спасибо.

1 Ответ

2 голосов
/ 12 августа 2011

0x80000000 является литералом, и поэтому его тип должен определяться правилами C #.Вы не использовали знак, и компилятор не выведет его для вас, поэтому он пытается найти наименьший тип данных, который будет соответствовать этому числу, как если бы оно было положительным.В данном случае это uint, а когда вы вместе |, int и uint, результат равен long.

. Во втором случае объявляется Int32.MinValueкак int и |, два int s приводят к другому int.

Если вы хотите использовать литерал, вы можете сначала его разыграть:

Int32Value = Int32Value | unchecked((int)0x80000000);

Обратите внимание, что синтаксис unchecked: 0x80000000 обычно переполняет и int (потому что на самом деле это положительное число, пока эти биты не сохраняются в int).

...