Conversions numériques intégrées (référence C#)
C# fournit un ensemble de types numériques intégraux et à virgule flottante. Il existe une conversion entre deux types numériques, implicites ou explicites. Vous devez utiliser une expression cast pour effectuer une conversion explicite.
Conversions numériques implicites
Le tableau suivant présente les conversions implicites prédéfinies entre les types numériques intégrés :
Du | À |
---|---|
sbyte | short , int , long , float , double , decimal ou nint |
byte | short , ushort , int , uint , long , ulong , float , double , decimal , nint ou nuint |
short | int , long , float , double , ou decimal , ou nint |
ushort | int , uint , long , ulong , float , double , ou decimal , nint , ou nuint |
int | long , float , double , ou decimal , nint |
uint | long , ulong , float , double , ou decimal , ou nuint |
long | float , double ou decimal |
ulong | float , double ou decimal |
float | double |
nint | long , float , double ou decimal |
nuint | ulong , float , double ou decimal |
Notes
Les conversions implicites de int
, uint
, long
, ulong
, nint
ou nuint
à float
et de long
, ulong
, nint
ou nuint
à double
peuvent provoquer une perte de précision, mais jamais une perte d’ordre de grandeur. Les autres conversions numériques implicites ne perdent jamais d’informations.
Notez également que
Tout type numérique intégral est implicitement convertible en n’importe quel type numérique à virgule flottante.
Il n’existe aucune conversion implicite vers les types
byte
etsbyte
. Il n’existe aucune conversion implicite à partir des typesdouble
etdecimal
.Il n’existe aucune conversion implicite entre le type
decimal
et le typefloat
oudouble
.La valeur d’une expression constante de type
int
(par exemple, une valeur représentée par un littéral intégral) peut être convertie ensbyte
,byte
,short
,ushort
,uint
,ulong
,nint
ounuint
, à condition qu’elle se trouve dans la plage du type de destination :byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Comme l’illustre l’exemple précédent, si la valeur constante n’est pas dans la plage du type de destination, une erreur de compilateur CS0031 se produit.
Conversions numériques explicites
Le tableau suivant indique les conversions explicites prédéfinies entre les types numériques intégrés pour lesquels il n’existe aucune conversion implicite :
Du | À |
---|---|
sbyte | byte , ushort , uint , ulong ounuint |
byte | sbyte |
short | sbyte , byte , ushort , uint , ulong ou nuint |
ushort | sbyte , byte ou short |
int | sbyte , byte , short , ushort , uint , ulong ou nuint |
uint | sbyte , byte , short , ushort , int ou nint |
long | sbyte , byte , short , ushort , int , uint , ulong , nint ou nuint |
ulong | sbyte , byte , short , ushort , int , uint , long , nint ou nuint |
float | sbyte , byte , short , ushort , int , uint , long , ulong , decimal , nint ou nuint |
double | sbyte , byte , short , ushort , int , uint , long , ulong , float , decimal , nint ou nuint |
decimal | sbyte , byte , short , ushort , int , uint , long , ulong , float , double , nint ou nuint |
nint | sbyte , byte , short , ushort , int , uint , ulong ou nuint |
nuint | sbyte , byte , short , ushort , int , uint , long ou nint |
Notes
Une conversion numérique explicite peut entraîner une perte de données ou lever une exception, généralement OverflowException.
Notez également que :
Quand vous convertissez une valeur d’un type intégral en un autre type intégral, le résultat varie selon le contexte de vérification du dépassement. Dans un contexte vérifié, la conversion réussit si la valeur source se situe dans la plage du type de destination. Sinon, une exception OverflowException est levée. Dans un contexte non vérifié, la conversion réussit toujours et procède comme suit :
Si le type source est plus grand que le type de destination, la valeur source est tronquée via l’abandon de ses bits « supplémentaires » les plus significatifs. Le résultat est ensuite traité en tant que valeur du type de destination.
Si le type source est plus petit que le type de destination, la valeur source fait l’objet d’une extension de signe ou d’une extension de zéros, pour avoir la même taille que le type de destination. L’extension de signe est utilisée si le type source est signé. L’extension de zéro est utilisée si le type source est non signé. Le résultat est ensuite traité en tant que valeur du type de destination.
Si le type source a la même taille que le type de destination, la valeur source est traitée comme une valeur du type de destination.
Quand vous convertissez une valeur de type
decimal
en type intégral, la valeur source est arrondie vers zéro à la valeur intégrale la plus proche. Si la valeur intégrale obtenue se trouve en dehors de la plage du type de destination, une exception OverflowException est levée.Quand vous convertissez une valeur
double
oufloat
en type intégral, cette valeur est arrondie vers zéro, à la valeur intégrale la plus proche. Si la valeur intégrale résultante se situe en dehors de la plage du type de destination, le résultat varie selon le contexte de vérification du dépassement. Dans un contexte vérifié, une exception OverflowException est levée, alors que dans un contexte non vérifié, le résultat est une valeur non spécifiée du type de destination.Quand vous convertissez
double
enfloat
, la valeurdouble
est arrondie à la valeurfloat
la plus proche. Si la valeurdouble
est inférieure ou supérieure au typefloat
, la conversion a pour résultat une valeur nulle ou un nombre infini.Dans le cas d’une conversion de
float
oudouble
endecimal
, la valeur source est convertie en une représentationdecimal
et arrondie au nombre le plus proche après la 28ème décimale, si nécessaire. Selon la valeur de la valeur source, la conversion peut aboutir à l’un des résultats suivants :Si la valeur source est trop petite pour être représentée en tant que
decimal
, le résultat est zéro.Si la valeur source est une valeur non numérique (NaN), un nombre infini ou une valeur trop grande pour être représentée au format
decimal
, une exception OverflowException est levée.
Quand vous convertissez
decimal
enfloat
oudouble
, la valeur source est arrondie à la valeurfloat
oudouble
la plus proche, respectivement.
spécification du langage C#
Pour plus d’informations, consultez les sections suivantes de la spécification du langage C# :