C # — Постоянное значение ‘4294901760’ не может быть преобразовано в ‘int’

#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;