Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 de 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 :
De | À |
---|---|
sbyte |
short , int , , float long , double , , decimal , ounint |
d’octets |
short , , ushort ulong uint long int , ou float double decimal nint nuint |
courte |
int , long , float , double , ou , ou decimal nint |
ushort |
int , , uint ulong float double long decimal ou , ou nint nuint |
int |
long , float , double ou , ou decimal , nint |
uint |
long , ulong , float , double , ou , ou decimal 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 |
Remarque
Les conversions implicites de int
, , uint
long
, ulong
, , nint
ou nuint
vers et à float
partir long
ulong
, , nint
ou nuint
à double
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’y a pas de conversions implicites vers les types et
sbyte
lesbyte
types. Il n’existe aucune conversion implicite desdouble
types etdecimal
des types.Il n’existe aucune conversion implicite entre le
decimal
type et le oudouble
lesfloat
types.Une valeur d’une expression constante de type
int
(par exemple, une valeur représentée par un littéral entier) peut être convertie implicitement ensbyte
, ,byte
,short
ushort
,uint
, ,ulong
,nint
ounuint
, si 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 du compilateur CS0031 se produit.
Conversions numériques explicites
Le tableau suivant présente les conversions explicites prédéfinies entre les types numériques intégrés pour lesquels il n’existe aucune conversion implicite :
De | À |
---|---|
sbyte |
byte , ushort , uint , ulong ounuint |
d’octets | sbyte |
courte |
sbyte , byte , ushort , uint , ulong , ou nuint |
ushort |
sbyte , byte ou short |
int |
sbyte , byte , , ushort short , uint , , ulong , ounuint |
uint |
sbyte , byte , short , ushort , int , ou nint |
long |
sbyte , byte , , ushort short , int , uint , ulong , nint , ounuint |
ulong |
sbyte , byte , , ushort short , int , uint , long , nint , ounuint |
float |
sbyte , , byte uint ushort int short , ou long ulong decimal nint nuint |
double |
sbyte , , byte short ushort uint int , ou long ulong float decimal nint nuint |
décimal |
sbyte , , byte short ushort uint int , ou long ulong float double nint nuint |
nint |
sbyte , byte , , ushort short , int , uint , , ulong , ounuint |
nuint |
sbyte , byte , , ushort short , int , uint , , long , ounint |
Remarque
Une conversion numérique explicite peut entraîner une perte de données ou lever une exception, généralement un OverflowException.
Notez également que :
Lorsque vous convertissez une valeur d’un type intégral en un autre type intégral, le résultat dépend du contexte de vérification de dépassement de capacité. Dans un contexte vérifié, la conversion réussit si la valeur source se trouve dans la plage du type de destination. Dans le cas contraire, un OverflowException est déclenché. Dans un contexte non vérifié, la conversion réussit toujours et se poursuit comme suit :
Si le type source est supérieur au type de destination, la valeur source est tronquée en ignorant 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 est étendue par signe ou étendue zéro afin qu’elle soit de la même taille que le type de destination. L’extension de signature est utilisée si le type source est signé ; zéro extension est utilisée si le type source n’est pas signé. Le résultat est ensuite traité en tant que valeur du type de destination.
Si le type source est de la même taille que le type de destination, la valeur source est traitée comme une valeur du type de destination.
Lorsque vous convertissez une
decimal
valeur en type intégral, cette valeur est arrondie à zéro à la valeur intégrale la plus proche. Si la valeur intégrale résultante est en dehors de la plage du type de destination, une OverflowException valeur est levée.Lorsque vous convertissez une ou
float
unedouble
valeur en type intégral, cette valeur est arrondie à zéro à la valeur intégrale la plus proche. Si la valeur intégrale résultante est en dehors de la plage du type de destination, le résultat dépend du contexte de vérification de dépassement de capacité. Dans un contexte vérifié, un OverflowException est levée, tandis que dans un contexte non vérifié, le résultat est une valeur non spécifiée du type de destination.Lorsque vous effectuez une conversion
double
float
, ladouble
valeur est arrondie à la valeur la plusfloat
proche. Si ladouble
valeur est trop petite ou trop grande pour s’adapter aufloat
type, le résultat est égal à zéro ou à l’infini.Lorsque vous convertissez ou
double
versfloat
decimal
, la valeur source est convertie endecimal
représentation et arrondie au nombre le plus proche après la 28e décimale si nécessaire. Selon la valeur de la valeur source, l’un des résultats suivants peut se produire :Si la valeur source est trop petite pour être représentée sous la forme d’un
decimal
, le résultat devient zéro.Si la valeur source est NaN (pas un nombre), l’infini ou trop grand pour être représenté sous la forme d’un
decimal
, un OverflowException est levée.
Lorsque vous convertissez
decimal
float
double
en ou , la valeur source est arrondie à la valeur la plus proche oudouble
la plusfloat
proche, respectivement.
Spécification du langage C#
Pour plus d’informations, consultez les sections suivantes de la spécification du langage C# :