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, doubleou decimal
ulong float, doubleou 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 et sbyte. Il n’existe aucune conversion implicite à partir des types double et decimal.

  • Il n’existe aucune conversion implicite entre le type decimal et le type float ou double.

  • 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 en sbyte, byte, short, ushort, uint, ulong, nint ou nuint, à 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, byteou 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 ou float 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 en float, la valeur double est arrondie à la valeur float la plus proche. Si la valeur double est inférieure ou supérieure au type float, la conversion a pour résultat une valeur nulle ou un nombre infini.

  • Dans le cas d’une conversion de float ou double en decimal, la valeur source est convertie en une représentation decimal 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 en float ou double, la valeur source est arrondie à la valeur float ou double la plus proche, respectivement.

spécification du langage C#

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

Voir aussi