Comment convertir uint en int en C #?


100

Comment convertir uint en int en C #?


5
Sachez que vous pouvez dépasser la valeur d'un int si vous faites cela.
Powerlord

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

Il serait plus sûr de convertir le uinten un longcar un longpeut contenir toutes les uintvaleurs où en tant que intne peut pas ( comme déjà mentionné )
Liam

Réponses:


187

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

ou

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

--ÉDITER

Informations incluses comme mentionné par Kenan EK


4
Notez que si le uintest supérieur à, int.MaxValuevous obtiendrez un résultat négatif si vous utilisez un cast, ou une exception si vous utilisez Convert.ToInt32.
LukeH

4
Ce qui fait de Convert.ToInt32 le meilleur choix imo.
mmcdole

4
@Luke - Non, pas nécessairement. Lors de la diffusion, cela dépend des paramètres de construction de votre projet pour savoir si l'arithmentique cochée ou non est la valeur par défaut. De plus, vous pouvez le modifier localement en utilisant les mots clés cochés et non cochés.
Greg Beech

@Greg: C'est vrai, mais le paramètre par défaut prêt à l'emploi n'est pas coché.
LukeH

@GregBeech Ce comportement est-il portable? en cas d'approche non contrôlée ??

12

Prenez note des mots checked- uncheckedclés et .

Il est important que vous souhaitiez que le résultat soit tronqué en entier ou qu'une exception soit levée si le résultat ne tient pas dans les 32 bits signés. La valeur par défaut n'est pas cochée.


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

Vous avez raison, mon mauvais, merci! - "La valeur par défaut de cette option est / checked-"
Kenan EK

Décoché ne "tronque" pas.
fractor

9

En supposant que vous souhaitiez simplement soulever les 32 bits d'un type et les vider tels quels dans l'autre type:

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

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

Inversement, si vous êtes plus intéressé à conserver les 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épassement de capacité si:

  • transtyper un entier négatif (par exemple: -1) en uint
  • lancer un uint positif entre 2,147,483,648 et 4,294,967,295 à un int

Dans notre cas, nous voulions que la uncheckedsolution conserve les 32 bits 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));
}  


0

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

int val = (int) uval;


0

Je dirais qu'en utilisant tryParse, il renverra 'false' si uint est trop grand pour un int.
N'oubliez pas qu'un uint peut aller beaucoup plus grand qu'un int, tant que vous allez> 0



-1
int intNumber = (int)uintNumber;

Selon le type de valeurs que vous attendez, vous voudrez peut-être vérifier la taille de uintNumber avant de procéder à la conversion. Un int a une valeur maximale d'environ 0,5 d'un uint.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.