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 | Działanie |
---|---|
sbyte | short , int long , float , double , decimal lubnint |
byte | short , ushort int , nint double ulong decimal uint long float lubnuint |
short | int , , long , double float lub , lub decimal nint |
ushort | int , uint , , long , float lub decimal nint ulong double nuint |
int | long , float , double lub decimal , nint |
uint | long , , ulong , double float lub , lub decimal nuint |
long | float , double lub decimal |
ulong | float , double lub decimal |
float | double |
nint | long , float , lub double decimal |
nuint | ulong , float , lub double decimal |
Uwaga
Niejawne konwersje z int
, , ulong
long
nint
uint
lub float
nuint
ulong
nint
long
z , 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 isbyte
. Nie ma niejawnych konwersji zdouble
typów idecimal
.Nie ma niejawnych konwersji między typem
decimal
a typamifloat
lubdouble
.Wartość wyrażenia stałego typu
int
(na przykład wartość reprezentowana przez literał liczby całkowitej) może zostać niejawnie przekonwertowana nasbyte
, ,byte
,uint
ushort
ulong
short
nint
lubnuint
, 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 | Działanie |
---|---|
sbyte | byte , , ushort , uint , ulong lub nuint |
byte | sbyte |
short | sbyte , , byte , ushort , uint , ulong lub nuint |
ushort | sbyte , byte lub short |
int | sbyte , byte short , ushort , uint , ulong lubnuint |
uint | sbyte , , byte , short , ushort , int lub nint |
long | sbyte , byte , short , ushort , int , uint , ulong , nint lub nuint |
ulong | sbyte , byte , short , ushort , int , uint , long , nint lub nuint |
float | sbyte , byte short , nint ulong uint decimal ushort int long lubnuint |
double | sbyte , byte , , short , int uint decimal ulong nint ushort long float lubnuint |
decimal | sbyte , byte , , short , int uint double ulong nint ushort long float lubnuint |
nint | sbyte , byte , , short , int ushort uint ulong lubnuint |
nuint | sbyte , byte , , short , int ushort uint long lubnint |
Uwaga
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 zgłaszany jest element OverflowException . W nieznakowanym kontekście konwersja zawsze się powiedzie i będzie kontynuowana 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 o znak lub zero rozszerzone, tak aby był taki sam rozmiar jak typ docelowy. Rozszerzenie podpisywania jest używane, jeśli typ źródła jest podpisany; rozszerzenie zero 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 lubfloat
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
nafloat
wartośćdouble
wartość jest zaokrąglona do najbliższejfloat
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
lubdouble
nadecimal
wartość wartość źródłowa jest konwertowana nadecimal
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
decimal
jako , 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ść lubdouble
wartość źródłowa jest zaokrąglona odpowiednio do najbliższejfloat
lubdouble
wartości.float
specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz następujące sekcje specyfikacji języka C#: