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, implicite ou explicite. Vous devez utiliser une expression de cast pour effectuer une conversion explicite.

Conversions numériques implicites

Le tableau suivant montre 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``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``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 vers et à partir de,, float long ulong nint ou nuint en double peuvent entraîner une perte de précision, mais jamais une perte d’un 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 type numérique à virgule flottante.

  • Il n’existe aucune conversion implicite des byte types 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 entier) peut être implicitement convertie en sbyte , byte , short , ushort , uint , ulong , nint ou 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 le montre l’exemple précédent, si la valeur de constante n’est pas comprise dans la plage du type de destination, une erreur de compilateur CS0031 se produit.

Conversions numériques explicites

Le tableau suivant montre les conversions explicites prédéfinies entre les types numériques intégrés pour lesquels il n’existe pas de conversion implicite:

Du À
sbyte byte, ushort , uint ou ulong , ou nuint
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 ouint
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, en général un 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 de source est plus petit que le type de destination, la valeur source est un signe étendu ou étendu à zéro, afin qu’elle soit de 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 double valeur est trop petite ou trop grande pour être contenue dans le float type, le résultat est zéro ou 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.

  • Lorsque vous convertissez decimal en float ou double , la valeur source est arrondie à la float valeur ou la plus proche double , respectivement.

spécification du langage C#

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

Voir aussi