Udostępnij za pomocą


Wbudowane konwersje liczbowe (odwołanie w C#)

Język C# udostępnia zestaw typów liczb całkowitych i zmiennoprzecinkowych . Istnieje konwersja między dwoma typami liczbowymi, niejawnymi lub jawnymi. Aby wykonać jawną konwersję, należy użyć wyrażenia rzutowania .

Niejawne konwersje liczbowe

W poniższej tabeli przedstawiono wstępnie zdefiniowane niejawne konwersje między wbudowanymi typami liczbowymi:

Źródło To
sbyte short, intlong, float, double, decimallubnint
bajtów short, ushortint, nintdoubleulongdecimaluintlongfloatlubnuint
krótkie int, , long, doublefloatlub , lub decimalnint
int, uint, , long, floatlub decimalnintulongdoublenuint
int long, float, doublelub decimal, nint
uint long, , ulong, doublefloatlub , lub decimalnuint
długi float, double lub decimal
ulong float, double lub decimal
float double
nint long, float, doublelub decimal
nuint ulong, float, doublelub decimal

Uwaga / Notatka

Niejawne konwersje z int, , ulonglongnintuintlub floatnuintulongnintlongz , lub nuint mogą spowodować double utratę dokładności, ale nigdy nie utratę wielkości. Inne niejawne konwersje liczbowe nigdy nie tracą żadnych informacji.

Należy również pamiętać, że

  • Każdy całkowity typ liczbowy jest niejawnie konwertowany na dowolny typ liczbowy zmiennoprzecinkowa.

  • Nie ma niejawnych konwersji na byte typy i sbyte . Nie ma niejawnych konwersji z double typów i decimal .

  • Nie ma niejawnych konwersji między typem decimal a typami float lub double .

  • Wartość wyrażenia stałego typu int (na przykład wartość reprezentowana przez literał liczby całkowitej) może zostać niejawnie przekonwertowana na sbyte, , byte, uintushortulongshortnintlub nuint, jeśli znajduje się w zakresie typu docelowego:

    byte a = 13;
    byte b = 300;  // CS0031: Constant value '300' cannot be converted to a 'byte'
    

    Jak pokazano w poprzednim przykładzie, jeśli wartość stała nie mieści się w zakresie typu docelowego, występuje błąd kompilatora CS0031 .

Jawne konwersje liczbowe

W poniższej tabeli przedstawiono wstępnie zdefiniowane jawne konwersje między wbudowanymi typami liczbowymi, dla których nie ma niejawnej konwersji:

Źródło To
sbyte byte, ushort, uint, ulonglub nuint
bajtów sbyte
krótkie sbyte, byte, ushort, uint, ulong lub nuint
sbyte, byte lub short
int sbyte, byteshort, ushort, uint, ulonglubnuint
uint sbyte, byte, short, ushort, int lub nint
długi sbyte, byte, short, ushort, int, uint, ulong, nint lub nuint
ulong sbyte, byte, short, ushort, int, uint, long, nint lub nuint
float sbyte, byteshort, nintulonguintdecimalushortintlonglubnuint
podwójny sbyte, byte, , short, intuintdecimalulongnintushortlongfloatlubnuint
decimal sbyte, byte, , short, intuintdoubleulongnintushortlongfloatlubnuint
nint sbyte, byte, , short, intushortuintulonglubnuint
nuint sbyte, byte, , short, intushortuintlonglubnint

Uwaga / Notatka

Jawna konwersja liczbowa może spowodować utratę danych lub zgłoszenie wyjątku, zazwyczaj .OverflowException

Należy również pamiętać, że:

  • Podczas konwertowania wartości typu całkowitego na inny typ całkowity wynik zależy od kontekstu sprawdzania przepełnienia. W zaznaczonym kontekście konwersja powiedzie się, jeśli wartość źródłowa mieści się w zakresie typu docelowego. W przeciwnym razie OverflowException zostanie wyrzucony. W niezweryfikowanym kontekście konwersja zawsze się powiedzie i odbywa się w następujący sposób:

    • Jeśli typ źródła jest większy niż typ docelowy, wartość źródłowa jest obcięta przez odrzucenie jego "dodatkowych" najbardziej znaczących bitów. Wynik jest następnie traktowany jako wartość typu docelowego.

    • Jeśli typ źródła jest mniejszy niż typ docelowy, wartość źródłowa jest rozszerzona znakiem lub zerem, tak aby miała ten sam rozmiar jak typ docelowy. Rozszerzenie znaku jest używane, jeśli typ źródła jest podpisany; rozszerzenie zerowe jest używane, jeśli typ źródła jest niepodpisany. Wynik jest następnie traktowany jako wartość typu docelowego.

    • Jeśli typ źródła jest taki sam jak typ docelowy, wartość źródłowa jest traktowana jako wartość typu docelowego.

  • Podczas konwertowania decimal wartości na typ całkowity ta wartość jest zaokrąglona w kierunku zera do najbliższej wartości całkowitej. Jeśli wynikowa wartość całkowita znajduje się poza zakresem typu docelowego, zostanie zgłoszony element OverflowException .

  • Podczas konwertowania double wartości lub float na typ całkowity ta wartość jest zaokrąglona do zera do najbliższej wartości całkowitej. Jeśli wynikowa wartość całkowita znajduje się poza zakresem typu docelowego, wynik zależy od kontekstu sprawdzania przepełnienia. W zaznaczonym kontekście OverflowException jest zgłaszany element , podczas gdy w nieznakowanym kontekście wynik jest nieokreśloną wartością typu docelowego.

  • Podczas konwersji double na floatwartość double wartość jest zaokrąglona do najbliższej float wartości. double Jeśli wartość jest za mała lub zbyt duża, aby zmieścić się w typiefloat, wynik wynosi zero lub nieskończoność.

  • W przypadku konwersji float lub double na decimalwartość wartość źródłowa jest konwertowana na decimal reprezentację i zaokrąglona do najbliższej liczby po 28 miejscu dziesiętnym, jeśli jest to konieczne. W zależności od wartości źródłowej może wystąpić jeden z następujących wyników:

    • Jeśli wartość źródłowa jest zbyt mała, aby być reprezentowana decimaljako , wynik stanie się zerowy.

    • Jeśli wartość źródłowa to NaN (a nie liczba), nieskończoność lub zbyt duża, aby być reprezentowana jako decimal, OverflowException jest zgłaszana wartość .

  • W przypadku konwersji decimal na wartość lub doublewartość źródłowa jest zaokrąglona odpowiednio do najbliższej float lub double wartości.float

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz następujące sekcje specyfikacji języka C#:

Zobacz także