Comment convertir un uint en int en C# ?
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
.
Comment convertir un uint en int en C# ?
É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.
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
.
@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.
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 :
Dans notre cas, nous voulions que le unchecked
solution pour préserver les 32bits tels quels, voici donc quelques exemples :
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...: 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));
}
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.
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
à unlong
en tant quelong
peut contenir tous lesuint
alors qu'unint
ne peut pas ( comme déjà mentionné )