Присвоение отрицательного шестнадцатеричного литерального значения как длинной - PullRequest
1 голос
/ 12 августа 2011

В VB следующие присваивания ниже имеют отрицательные значения:

Dim a As Long = &HEFCDAB89
Dim b As Long = &H98BADCFE

Назначение одинаковых шестнадцатеричных значений в C # не приводит к тем же значениям:

long a = 0xEFCDAB89;
long b = 0x98BADCFE;

Как я могуприсваивать отрицательные шестнадцатеричные значения в C # как в VB?

Ответы [ 2 ]

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

Используйте литералы L и UL :

long b = 0xEFCDAB89L; //signed long
long c = (long)0x98BADCFEUL; //unsigned long
0 голосов
/ 12 августа 2011

Я не знаю никаких хитростей, чтобы сказать компилятору, что вы хотите указать отрицательный шестнадцатеричный литерал, я не уверен, что это действительно возможно.Я считаю, что ваш единственный вариант - привести ulong литерал к long.Это должно быть сделано в непроверенном контексте.Это все еще значение, известное во время компиляции, поэтому фактический код приведения не будет сгенерирован.

long value = unchecked((long)0xFFFFFFFFFFFFFFFE);
// value == -2L

Обратите внимание, что в VB &HEFCDAB89 и &H98BADCFE на самом деле Integer литералы.Просто так случилось, что их повысили до Long.Чтобы указать литерал Long, необходимо включить суффикс L.Таким образом, ваши назначения должны быть:

Dim a As Long = &HFFFFFFFFEFCDAB89L ' these are actually long literals now
Dim b As Long = &HFFFFFFFF98BADCFEL
...