Sdílet prostřednictvím


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:

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 byte a sbyte typy. Neexistují žádné implicitní převody z typů double a decimal typů.

  • Mezi typem decimal a float typy double 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 na sbyte, byte, , , uintushortulongshortnintnebo nuint, 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 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 na float 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 doubledouble na floathodnotu se hodnota zaokrouhlí na nejbližší float hodnotu. double Pokud je hodnota příliš malá nebo příliš velká, aby se vešla do float typu, výsledek je nula nebo nekonečno.

  • Při převodu float nebo double na decimalhodnotu se zdrojová hodnota převede na decimal 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 na float hodnotu nebo doublese zdrojová hodnota zaokrouhlí na nejbližší float hodnotu nebo double hodnotu.

Specifikace jazyka C#

Další informace najdete v následujících částech specifikace jazyka C#:

Viz také