Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
C# предоставляет набор целочисленных и числовых типов с плавающей запятой . Существует преобразование между двумя числовыми типами, неявными или явными. Для выполнения явного преобразования необходимо использовать выражение приведения .
Неявные числовые преобразования
В следующей таблице показаны предопределенные неявные преобразования между встроенными числовыми типами:
От | Кому |
---|---|
знаковый байт |
short , int , long double float decimal илиnint |
байт |
short , ushort , int float uint ulong double long decimal , или nint nuint |
короткие |
int , , long , double float или decimal nint |
ushort |
int , uint , , ulong long double float или , или decimal nint nuint |
int |
long , , float double или decimal ,nint |
uint |
long , , ulong , double float или decimal nuint |
длинный |
float , double или decimal |
ulong |
float , double или decimal |
float | double |
nint |
long , float , double или decimal |
nuint |
ulong , float , double или decimal |
Замечание
Неявные преобразования из int
, , uint
, nint
long
ulong
или из long
, или float
nuint
из , ulong
nint
или nuint
double
могут привести к потере точности, но никогда не потеря порядка величины. Другие неявные числовые преобразования никогда не теряют никаких сведений.
Кроме того, обратите внимание на то, что
Любой целочисленный числовый тип неявно преобразуется в любой числовый тип с плавающей запятой.
Неявные преобразования в
byte
иsbyte
типы отсутствуют. Неявные преобразования изdouble
иdecimal
типов отсутствуют.Нет неявных преобразований между типом
decimal
иfloat
double
типами.Значение константного выражения типа
int
(например, значение, представленное целым литералом), может быть неявно преобразовано вsbyte
,byte
, , ,ushort
ulong
nint
short
uint
, илиnuint
, если он находится в диапазоне типа назначения:byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Как показано в предыдущем примере, если константное значение не находится в диапазоне конечного типа, возникает ошибка компилятора CS0031 .
Явные числовые преобразования
В следующей таблице показаны предопределенные явные преобразования между встроенными числовыми типами, для которых не существует неявного преобразования:
От | Кому |
---|---|
знаковый байт |
byte , ushort , uint , ulong или nuint |
байт | sbyte |
короткие |
sbyte , byte , ushort , uint , ulong или nuint |
ushort |
sbyte , byte или short |
int |
sbyte , byte , short uint ushort ulong илиnuint |
uint |
sbyte , byte , short , ushort , int или nint |
длинный |
sbyte , byte , short , ushort , int , uint , ulong , nint или nuint |
ulong |
sbyte , byte , short , ushort , int , uint , long , nint или nuint |
float |
sbyte , byte , short long ushort uint ulong int decimal , или nint nuint |
двойной |
sbyte , byte , short long ushort float int nint uint ulong decimal илиnuint |
десятичное |
sbyte , byte , short long ushort float int nint uint ulong double илиnuint |
nint |
sbyte , byte , , ushort short int uint ulong илиnuint |
nuint |
sbyte , byte , , ushort short int uint long илиnint |
Замечание
Явное числовое преобразование может привести к потере данных или возникновению исключения, как правило OverflowException, .
Кроме того, обратите внимание на следующее:
При преобразовании значения целочисленного типа в другой целочисленный тип результат зависит от контекста проверки переполнения. В проверяемом контексте преобразование завершается успешно, если исходное значение находится в диапазоне целевого типа. В противном случае выбрасывается OverflowException. В незаверяемом контексте преобразование всегда выполняется успешно и выполняется следующим образом:
Если исходный тип больше целевого типа, то исходное значение усечено путем отмены его "дополнительных" наиболее значимых битов. Результат затем обрабатывается как значение целевого типа.
Если исходный тип меньше конечного типа, то исходное значение расширяется с помощью знака или нуля, чтобы оно было того же размера, как целевой тип. Расширение знака используется, если исходный тип имеет знак; расширение нулём используется, если исходный тип без знака. Результат затем обрабатывается как значение целевого типа.
Если исходный тип совпадает с типом назначения, то исходное значение рассматривается как значение целевого типа.
При преобразовании значения в целочисленный
decimal
тип это значение округляется до нуля до ближайшего целочисленного значения. Если результирующее целочисленное значение выходит за пределы диапазона целевого типа, OverflowException создается исключение.При преобразовании
double
илиfloat
значении в целочисленный тип это значение округляется до нуля до ближайшего целочисленного значения. Если результирующее целочисленное значение находится вне диапазона целевого типа, результат зависит от контекста проверки переполнения. В проверяемом контексте создается исключение, в то время как в незавершенном контексте OverflowException результат является неопределенным значением целевого типа.При преобразовании
double
float
вdouble
значение округляется до ближайшегоfloat
значения.double
Если значение слишком мало или слишком большое, чтобы поместиться вfloat
тип, результат равен нулю или бесконечности.При преобразовании
float
илиdouble
decimal
переходе исходное значение преобразуется вdecimal
представление и округляется до ближайшего числа после 28-го десятичного разряда при необходимости. В зависимости от значения исходного значения может произойти одно из следующих результатов:Если исходное значение слишком мало для представления в виде
decimal
, результат становится нулевым.Если исходное значение — NaN (не число), бесконечность или слишком большое значение, которое должно быть представлено как
decimal
, OverflowException вызывается.
При преобразовании
decimal
float
в илиdouble
, исходное значение округляется до ближайшегоfloat
илиdouble
значения соответственно.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#: