Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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:
| Od | To |
|---|---|
| sbyte |
short, int, , floatlong, double, , decimalnebonint |
| bajtové |
short, ushort, , int, longfloatulongdoubleuintdecimal, , , nintnuint |
| krátké |
int, long, float, double, nebo , nebo decimalnint |
int, uint, , long, ulong, float, doublenebo decimal, nintnebo nuint |
|
| int |
long, float, doublenebo decimal, nint |
long, ulong, float, double, nebo , nebo decimalnuint |
|
| dlouhý |
float, double nebo decimal |
| ulong |
float, double nebo decimal |
| float | double |
| nint |
long, float, doublenebo decimal |
| nuint |
ulong, float, doublenebo decimal |
Poznámka:
Implicitní převody z int, , longuintulongnintnebo nuint z floatlong, ulong, nintnebo 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
byteasbytetypy. Neexistují žádné implicitní převody z typůdoubleadecimaltypů.Mezi typem
decimalafloattypydoubleneexistují žá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, , ,uintushortulongshortnintnebonuint, 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:
| Od | To |
|---|---|
| sbyte |
byte, ushort, uint, ulongnebo nuint |
| bajtové | sbyte |
| krátké |
sbyte, byte, ushort, uint, , ulongnebo nuint |
sbyte, byte nebo short |
|
| int |
sbyte, byte, , ushortshort, uint, , ulongnebonuint |
sbyte, byte, short, ushort, , intnebo nint |
|
| dlouhý |
sbyte, byte, , short, ushort, intuint, ulong, , nebo nintnuint |
| ulong |
sbyte, byte, , short, ushort, intuint, long, , nebo nintnuint |
| float |
sbyte, byte, , short, intlonguintulongushortdecimal, , , nintnuint |
| dvojitý |
sbyte, byte, , short, intulongushortlongfloatuintdecimal, nint, nebonuint |
| desetinný |
sbyte, byte, , short, intulongushortlongfloatuintdouble, nint, nebonuint |
| nint |
sbyte, byte, , short, intushort, uint, , nebo ulongnuint |
| nuint |
sbyte, byte, , short, intushort, uint, , nebo longnint |
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. V opačném případě se vyvolá OverflowException. 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
decimalhodnoty 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
doublehodnoty nafloatceločí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
doubledoublenafloathodnotu se hodnota zaokrouhlí na nejbližšífloathodnotu.doublePokud je hodnota příliš malá nebo příliš velká, aby se vešla dofloattypu, výsledek je nula nebo nekonečno.Při převodu
floatnebodoublenadecimalhodnotu se zdrojová hodnota převede nadecimalreprezentaci 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
decimalnafloathodnotu nebodoublese zdrojová hodnota zaokrouhlí na nejbližšífloathodnotu nebodoublehodnotu.
Specifikace jazyka C#
Další informace najdete v následujících částech specifikace jazyka C#: