Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
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
sbytelesbytetypes. Il n’existe aucune conversion implicite desdoubletypes etdecimaldes types.Il n’existe aucune conversion implicite entre le
decimaltype et le oudoublelesfloattypes.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,shortushort,uint, ,ulong,nintounuint, 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
decimalvaleur 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
floatunedoublevaleur 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, ladoublevaleur est arrondie à la valeur la plusfloatproche. Si ladoublevaleur est trop petite ou trop grande pour s’adapter aufloattype, le résultat est égal à zéro ou à l’infini.Lorsque vous convertissez ou
doubleversfloatdecimal, la valeur source est convertie endecimalrepré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 oudoublela plusfloatproche, respectivement.
Spécification du langage C#
Pour plus d’informations, consultez les sections suivantes de la spécification du langage C# :