#c# #windows-phone-7
#c# #windows-phone-7
Вопрос:
Приветствия,
Я не могу поверить, что задаю такой простой вопрос, но это не имеет смысла, поэтому вот он :).
В C # на Windows Phone 7 / .net я пытаюсь определить константу в классе следующим образом:
// error CS0266: Cannot implicitly convert type 'uint' to 'int'.
// An explicit conversion exists (are you missing a cast?)
public const int RED = 0xffff0000;
Если я добавлю вокруг него приведение (int) вот так, я получу другую ошибку:
// error CS0221: Constant value '4294901760' cannot be converted to a 'int'
// (use 'unchecked' syntax to override)
public const int RED = (int)0xffff0000;
Но я знаю, что мой int 32-разрядный, следовательно, имеет диапазон от -2 147 483 648 до 2 147 483 647, см. http://msdn.microsoft.com/en-us/library/5kzh1b5w (v = против 80).aspx
Так что же получается?
Заранее спасибо!
свиньи
Ответ №1:
Как вы заметили, диапазон Int32
составляет от -2 147 483 648 до 2 147 483 647, поэтому может храниться любое число в пределах этого диапазона, но могут храниться только числа в пределах этого диапазона. 4 294 901 760 больше, чем 2 147 483 647, поэтому не помещается в Int32
.
Что с этим делать, зависит от того, чего вы хотите достичь. Если вы просто хотите Int32
с битовым шаблоном ffff0000
, то, как предлагается, используйте unchecked
:
int y = unchecked((int)0xffff0000);
y
теперь имеет значение -65536, которое является битовым шаблоном, интерпретируемым как целое число со знаком.
Однако! Если вам действительно нужно значение 4,294,901,760, вы должны использовать соответствующий ему тип данных — so UInt32
.
Комментарии:
1. Да, конечно. Должно быть, поздно! Итак … если я использую unchecked, будет ли c # усекать значение или переносить его, сохраняя данные?
2. msdn.microsoft.com/en-us/library/a569z7k8(v=vs.71).aspx . Итак: В непроверенном контексте, если выражение выдает значение, выходящее за пределы диапазона целевого типа, результат усекается.
3. @Vik эта страница немного вводит в заблуждение (последняя версия лучше) — поскольку типы данных здесь одинакового размера, на самом деле это не «усеченный»
4. Вы правы AakashM, значение начнется сначала: с минимального значения размер переполнения.
5. Спасибо AakashM! Путаница возникла из-за способа обработки c # int32 по сравнению с uint32… Это устраняет проблему!
Ответ №2:
int
является целым числом со знаком в диапазоне от -2 147 483 648 до 2 147 483 647.
Вам нужно целое число без знака, т.е. uint
точно так же, как указано в первом сообщении об ошибке.
Ответ №3:
public const uint RED = 0xffff0000;
Ответ №4:
Попробуйте использовать unchecked, как предложено в сообщении компилятора:
public const int RED = unchecked((int)0xffff0000);
Это определяется RED
как -65536, что равно 0xffff0000, интерпретируемому как signed int.
Ответ №5:
Это должно помочь вам обойти непроверенный:
public const int RED = 0xffff << 16;