Как преобразовать uint в int в С#?

Как преобразовать uint в int в С#?

Ответ 1

Дано:

 uint n = 3;

int i = checked((int)n); //throws OverflowException if n > Int32.MaxValue
int i = unchecked((int)n); //converts the bits only 
                           //i will be negative if n > Int32.MaxValue

int i = (int)n; //same behavior as unchecked

или

int i = Convert.ToInt32(n); //same behavior as checked

- EDIT

Включенная информация, упомянутая Kenan E. K.

Ответ 2

Обратите внимание на checked и unchecked ключевые слова.

Имеет значение, если вы хотите, чтобы результат был усечен до типа int, или возникло исключение, если результат не помещается в 32-битные символы со знаком. По умолчанию флажок снят.

Ответ 3

Предполагая, что вы хотите просто поднять 32 бита из одного типа и сбросить их как есть в другой тип:

uint asUint = unchecked((uint)myInt);
int asInt = unchecked((int)myUint);

Тип назначения будет слепо выбирать 32 бита и переинтерпретировать их.

И наоборот, если вас больше интересует сохранение десятичных/числовых значений в пределах диапазона самого типа назначения:

uint asUint = checked((uint)myInt);
int asInt = checked((int)myUint);

В этом случае вы получите исключения переполнения, если:

  • литье отрицательного int (например: -1) в uint
  • листинг положительного uint между 2 147 483 648 и 4 294 967 295 на int

В нашем случае мы хотели, чтобы решение unchecked сохраняло 32 бита as-is, поэтому вот несколько примеров:

Примеры

int = > uint

int....: 0000000000 (00-00-00-00)
asUint.: 0000000000 (00-00-00-00)
------------------------------
int....: 0000000001 (01-00-00-00)
asUint.: 0000000001 (01-00-00-00)
------------------------------
int....: -0000000001 (FF-FF-FF-FF)
asUint.: 4294967295 (FF-FF-FF-FF)
------------------------------
int....: 2147483647 (FF-FF-FF-7F)
asUint.: 2147483647 (FF-FF-FF-7F)
------------------------------
int....: -2147483648 (00-00-00-80)
asUint.: 2147483648 (00-00-00-80)

uint = > int

uint...: 0000000000 (00-00-00-00)
asInt..: 0000000000 (00-00-00-00)
------------------------------
uint...: 0000000001 (01-00-00-00)
asInt..: 0000000001 (01-00-00-00)
------------------------------
uint...: 2147483647 (FF-FF-FF-7F)
asInt..: 2147483647 (FF-FF-FF-7F)
------------------------------
uint...: 4294967295 (FF-FF-FF-FF)
asInt..: -0000000001 (FF-FF-FF-FF)
------------------------------

Код

int[] testInts = { 0, 1, -1, int.MaxValue, int.MinValue };
uint[] testUints = { uint.MinValue, 1, uint.MaxValue / 2, uint.MaxValue };

foreach (var Int in testInts)
{
    uint asUint = unchecked((uint)Int);
    Console.WriteLine("int....: {0:D10} ({1})", Int, BitConverter.ToString(BitConverter.GetBytes(Int)));
    Console.WriteLine("asUint.: {0:D10} ({1})", asUint, BitConverter.ToString(BitConverter.GetBytes(asUint)));
    Console.WriteLine(new string('-',30));
}
Console.WriteLine(new string('=', 30));
foreach (var Uint in testUints)
{
    int asInt = unchecked((int)Uint);
    Console.WriteLine("uint...: {0:D10} ({1})", Uint, BitConverter.ToString(BitConverter.GetBytes(Uint)));
    Console.WriteLine("asInt..: {0:D10} ({1})", asInt, BitConverter.ToString(BitConverter.GetBytes(asInt)));
    Console.WriteLine(new string('-', 30));
}  

Ответ 4

Convert.ToInt32() принимает значение uint как значение.

Ответ 5

Предполагая, что значение, содержащееся в uint, может быть представлено в int, тогда оно просто:

int val = (int) uval;

Ответ 6

uint i = 10;
int j = (int)i;

or 
int k = Convert.ToInt32(i)

Ответ 7

Я бы сказал, используя tryParse, он вернет "false", если uint будет большим для int.
Не забывайте, что uint может намного больше, чем int, пока вы идете > 0

Ответ 8

int intNumber = (int)uintNumber;

В зависимости от того, какие значения вы ожидаете, вы можете проверить, насколько велика uintNumber перед выполнением преобразования. Значение int имеет максимальное значение около 5. uint.