Předdefinované číselné převody (referenční dokumentace jazyka C#)
Jazyk C# poskytuje sadu integrálních a číselných typů s plovoucí desetinou čárkou . Existuje převod mezi libovolnými dvěma číselnými typy, buď implicitním, nebo explicitním. K provedení explicitního převodu je nutné použít výraz přetypování.
Implicitní číselné převody
Následující tabulka ukazuje předdefinované implicitní převody mezi předdefinovanými číselnými typy:
Z | Záměr |
---|---|
sbyte | short , int , , float long , double , , decimal nebonint |
byte | short , ushort , , int , long float ulong double uint decimal , , , nint nuint |
short | int , long , float , double , nebo , nebo decimal nint |
ushort | int , uint , , long , ulong , float , double nebo decimal , nint nebo nuint |
int | long , float , double nebo decimal , nint |
uint | long , ulong , float , double , nebo , nebo decimal nuint |
long | float , double nebo decimal |
ulong | float , double nebo decimal |
float | double |
nint | long , float , double nebo decimal |
nuint | ulong , float , double nebo decimal |
Poznámka:
Implicitní převody z int
, , long
uint
ulong
nint
nebo nuint
z float
long
, ulong
, nint
nebo nuint
mohou double
způsobit ztrátu přesnosti, ale nikdy ztrátu pořadí velikostí. Ostatní implicitní číselné převody nikdy neztratí žádné informace.
Všimněte si také, že
Jakýkoli celočíselný číselný typ je implicitně konvertibilní na jakýkoli číselný typ s plovoucí desetinou čárkou.
Neexistují žádné implicitní převody na typy
byte
asbyte
typy. Neexistují žádné implicitní převody z typůdouble
adecimal
typů.Mezi typem
decimal
afloat
typydouble
neexistují žádné implicitní převody.Hodnota konstantního výrazu typu
int
(například hodnota reprezentovaná celočíselnou literálem) lze implicitně převést nasbyte
,byte
, , ,uint
ushort
ulong
short
nint
nebonuint
, pokud je v rozsahu cílového typu:byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Jak ukazuje předchozí příklad, pokud konstantní hodnota není v rozsahu cílového typu, dojde k chybě kompilátoru CS0031 .
Explicitní číselné převody
Následující tabulka ukazuje předdefinované explicitní převody mezi předdefinovanými číselnými typy, pro které neexistuje implicitní převod:
Z | Záměr |
---|---|
sbyte | byte , ushort , uint , ulong nebo nuint |
byte | sbyte |
short | sbyte , byte , ushort , uint , , ulong nebo nuint |
ushort | sbyte , byte nebo short |
int | sbyte , byte , , ushort short , uint , , ulong nebonuint |
uint | sbyte , byte , short , ushort , , int nebo nint |
long | sbyte , byte , short , ushort , int , uint , ulong , nint nebo nuint |
ulong | sbyte , byte , short , ushort , int , uint , long , nint nebo nuint |
float | sbyte , byte , , short , int long uint ulong ushort decimal , , , nint nuint |
double | sbyte , byte , , short , int ulong ushort long float uint decimal , nint , nebonuint |
decimal | sbyte , byte , , short , int ulong ushort long float uint double , nint , nebonuint |
nint | sbyte , byte , , short , int ushort , uint , , nebo ulong nuint |
nuint | sbyte , byte , , short , int ushort , uint , , nebo long nint |
Poznámka:
Explicitní číselný převod může vést ke ztrátě dat nebo vyvolá výjimku, obvykle .OverflowException
Všimněte si také, že:
Při převodu hodnoty integrálního typu na jiný celočíselný typ závisí výsledek na kontext kontroly přetečení. V kontrolovaném kontextu bude převod úspěšný, pokud zdrojová hodnota spadá do rozsahu cílového typu. OverflowException V opačném případě je vyvolán. V nezaškrtnutém kontextu bude převod vždy úspěšný a bude pokračovat následujícím způsobem:
Pokud je zdrojový typ větší než cílový typ, je zdrojová hodnota zkrácena zrušením jeho "extra" nejvýznamnějších bitů. Výsledek se pak považuje za hodnotu cílového typu.
Pokud je typ zdroje menší než cílový typ, je zdrojová hodnota buď prodloužena, nebo je rozšířena nulou, aby byla stejná jako cílový typ. Rozšíření podpisu se používá, pokud je typ zdroje podepsán; Pokud je typ zdroje nepodepsaný, použije se nulové rozšíření. Výsledek se pak považuje za hodnotu cílového typu.
Pokud je typ zdroje stejná jako cílový typ, je zdrojová hodnota považována za hodnotu cílového typu.
Při převodu
decimal
hodnoty na celočíselný typ se tato hodnota zaokrouhlí na nulu na nejbližší celočíselnou hodnotu. Pokud je výsledná integrální hodnota mimo rozsah cílového typu, OverflowException vyvolá se chyba.Při převodu
double
hodnoty nafloat
celočíselný typ se tato hodnota zaokrouhlí směrem k nule na nejbližší celočíselnou hodnotu. Pokud je výsledná integrální hodnota mimo rozsah cílového typu, výsledek závisí na kontextu kontroly přetečení. V zaškrtnutém kontextu OverflowException je vyvolána, zatímco v nezaškrtnutém kontextu je výsledkem nezadaná hodnota cílového typu.Při převodu
double
double
nafloat
hodnotu se hodnota zaokrouhlí na nejbližšífloat
hodnotu.double
Pokud je hodnota příliš malá nebo příliš velká, aby se vešla dofloat
typu, výsledek je nula nebo nekonečno.Při převodu
float
nebodouble
nadecimal
hodnotu se zdrojová hodnota převede nadecimal
reprezentaci a v případě potřeby se zaokrouhlí na nejbližší číslo za 28. desetinnou čárkou. V závislosti na hodnotě zdrojové hodnoty může dojít k jednomu z následujících výsledků:Pokud je zdrojová hodnota příliš malá, aby byla reprezentována jako hodnota
decimal
, výsledek se změní na nulu.Pokud je zdrojová hodnota NaN (ne číslo), nekonečno nebo příliš velké, aby bylo reprezentováno jako
decimal
, OverflowException je vyvolán.
Při převodu
decimal
nafloat
hodnotu nebodouble
se zdrojová hodnota zaokrouhlí na nejbližšífloat
hodnotu nebodouble
hodnotu.
specifikace jazyka C#
Další informace najdete v následujících částech specifikace jazyka C#: