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, , floatlong, double, , decimalnebonint
byte short, ushort, , int, longfloatulongdoubleuintdecimal, , , nintnuint
short int, long, float, double, nebo , nebo decimalnint
ushort int, uint, , long, ulong, float, doublenebo decimal, nintnebo nuint
int long, float, doublenebo decimal, nint
uint long, ulong, float, double, nebo , nebo decimalnuint
long 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:

Z Záměr
sbyte byte, ushort, uint, ulongnebo nuint
byte sbyte
short sbyte, byte, ushort, uint, , ulongnebo nuint
ushort sbyte, byte nebo short
int sbyte, byte, , ushortshort, uint, , ulongnebonuint
uint sbyte, byte, short, ushort, , intnebo 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, intlonguintulongushortdecimal, , , nintnuint
double sbyte, byte, , short, intulongushortlongfloatuintdecimal, nint, nebonuint
decimal 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. 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 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é