Partager via


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 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, , floatlong, double, , decimal, ounint
d’octets short, , ushortulonguintlongint, ou floatdoubledecimalnintnuint
courte int, long, float, double, ou , ou decimalnint
ushort int, , uintulongfloatdoublelongdecimalou , ou nintnuint
int long, float, doubleou , ou decimal, nint
uint long, ulong, float, double, ou , ou decimalnuint
long float, double ou decimal
ulong float, double ou decimal
float double
nint long, float, doubleou decimal
nuint ulong, float, doubleou decimal

Remarque

Les conversions implicites de int, , uintlong, ulong, , nintou nuint vers et à float partir longulong, , nintou 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 les byte types. Il n’existe aucune conversion implicite des double types et decimal des types.

  • Il n’existe aucune conversion implicite entre le decimal type et le ou double les float 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 en sbyte, , byte, shortushort, uint, , ulong, nintou nuint, 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, , ushortshort, uint, , ulong, ounuint
uint sbyte, byte, short, ushort, int, ou nint
long sbyte, byte, , ushortshort, int, uint, ulong, nint, ounuint
ulong sbyte, byte, , ushortshort, int, uint, long, nint, ounuint
float sbyte, , byteuintushortintshort, ou longulongdecimalnintnuint
double sbyte, , byteshortushortuintint, ou longulongfloatdecimalnintnuint
décimal sbyte, , byteshortushortuintint, ou longulongfloatdoublenintnuint
nint sbyte, byte, , ushortshort, int, uint, , ulong, ounuint
nuint sbyte, byte, , ushortshort, 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 une double 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 doublefloat, la double valeur est arrondie à la valeur la plus float proche. Si la double valeur est trop petite ou trop grande pour s’adapter au float type, le résultat est égal à zéro ou à l’infini.

  • Lorsque vous convertissez ou double vers floatdecimal, la valeur source est convertie en decimal 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 decimalfloatdoubleen ou , la valeur source est arrondie à la valeur la plus proche ou double la plus float proche, respectivement.

Spécification du langage C#

Pour plus d’informations, consultez les sections suivantes de la spécification du langage C# :

Voir aussi