110 votes

Comment convertir un uint en int en C# ?

Comment convertir un uint en int en C# ?

5 votes

Sachez que vous pouvez déborder la valeur d'un int si vous faites cela.

1 votes

Oui, vous devrez vous assurer de gérer gracieusement l'exception en plaçant votre objet dans un état acceptable si la valeur de l'uint est supérieure à Int32.MaxValue (qui se trouve être 2 147 483 647).

0 votes

Il serait plus sûr de convertir le uint à un long en tant que long peut contenir tous les uint alors qu'un int ne peut pas ( comme déjà mentionné )

210voto

Samuel Carrijo Points 9056

Étant donné :

 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

o

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

--EDIT

Informations incluses telles que mentionnées par Kenan E. K.

4 votes

Notez que si le uint est supérieure à int.MaxValue vous obtiendrez un résultat négatif si vous utilisez un cast, ou une exception si vous utilisez Convert.ToInt32 .

5 votes

Ce qui fait de Convert.ToInt32 le meilleur choix, je pense.

5 votes

@Luke - Non, pas nécessairement. Lors de la coulée, cela dépend des paramètres de construction de votre projet pour savoir si l'arithmétique cochée ou non cochée est la valeur par défaut. En outre, vous pouvez modifier ceci sur une base locale en utilisant les mots-clés checked et unchecked.

12voto

Kenan E. K. Points 8497

Prenez note de la checked y unchecked mots-clés.

Cela importe si vous voulez que le résultat soit tronqué à l'int ou qu'une exception soit levée si le résultat ne tient pas dans les 32 bits signés. Par défaut, cette option n'est pas cochée.

2 votes

Je crois que la valeur par défaut n'est pas cochée. +1 pour avoir souligné ce point - la source d'erreurs difficiles à déboguer.

0 votes

Vous avez raison, c'est ma faute, merci ! - "La valeur par défaut de cette option est /checked-"

1 votes

La case non cochée ne "tronque" pas.

12voto

DeepSpace101 Points 1973

En supposant que vous vouliez simplement extraire les 32 bits d'un type et les transférer tels quels dans l'autre type :

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

Le type de destination prendra aveuglément les 32 bits et les réinterprétera.

Inversement, si vous êtes plus intéressé par le maintien des valeurs décimales/numériques dans la plage du type de destination lui-même :

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

Dans ce cas, vous obtiendrez des exceptions de débordement si :

  • transformation d'un int négatif (ex : -1) en uint
  • Transformation d'un uint positif compris entre 2 147 483 648 et 4 294 967 295 en un int.

Dans notre cas, nous voulions que le unchecked solution pour préserver les 32bits tels quels, voici donc quelques exemples :

Exemples

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)
------------------------------

Code

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));
}

8voto

NikolaiDante Points 2990

Convert.ToInt32() prend uint comme une valeur.

0voto

Julian Points 1441

En supposant que la valeur contenue dans l'uint peut être représentée par un int, alors c'est aussi simple que cela :

int val = (int) uval;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X