Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
C# предоставляет набор целочисленных и числовых типов с плавающей запятой . Существует преобразование между двумя числовыми типами, неявными или явными. Для выполнения явного преобразования необходимо использовать выражение приведения .
Неявные числовые преобразования
В следующей таблице показаны предопределенные неявные преобразования между встроенными числовыми типами:
| От | Кому |
|---|---|
| знаковый байт |
short, int, longdoublefloatdecimalилиnint |
| байт |
short, ushort, intfloatuintulongdoublelongdecimal, или nintnuint |
| короткие |
int, , long, doublefloatили decimalnint |
| ushort |
int, uint, , ulonglongdoublefloatили , или decimalnintnuint |
| int |
long, , floatdoubleили decimal,nint |
| uint |
long, , ulong, doublefloatили decimalnuint |
| длинный |
float, double или decimal |
| ulong |
float, double или decimal |
| float | double |
| nint |
long, float, doubleили decimal |
| nuint |
ulong, float, doubleили decimal |
Замечание
Неявные преобразования из int, , uint, nintlongulongили из long, или floatnuint из , ulongnintили nuintdouble могут привести к потере точности, но никогда не потеря порядка величины. Другие неявные числовые преобразования никогда не теряют никаких сведений.
Кроме того, обратите внимание на то, что
Любой целочисленный числовый тип неявно преобразуется в любой числовый тип с плавающей запятой.
Неявные преобразования в
byteиsbyteтипы отсутствуют. Неявные преобразования изdoubleиdecimalтипов отсутствуют.Нет неявных преобразований между типом
decimalиfloatdoubleтипами.Значение константного выражения типа
int(например, значение, представленное целым литералом), может быть неявно преобразовано вsbyte,byte, , ,ushortulongnintshortuint, или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, shortuintushortulongили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, shortlongushortuintulongintdecimal, или nintnuint |
| двойной |
sbyte, byte, shortlongushortfloatintnintuintulongdecimalилиnuint |
| десятичное |
sbyte, byte, shortlongushortfloatintnintuintulongdoubleилиnuint |
| nint |
sbyte, byte, , ushortshortintuintulongилиnuint |
| nuint |
sbyte, byte, , ushortshortintuintlongилиnint |
Замечание
Явное числовое преобразование может привести к потере данных или возникновению исключения, как правило OverflowException, .
Кроме того, обратите внимание на следующее:
При преобразовании значения целочисленного типа в другой целочисленный тип результат зависит от контекста проверки переполнения. В проверяемом контексте преобразование завершается успешно, если исходное значение находится в диапазоне целевого типа. В противном случае выбрасывается OverflowException. В незаверяемом контексте преобразование всегда выполняется успешно и выполняется следующим образом:
Если исходный тип больше целевого типа, то исходное значение усечено путем отмены его "дополнительных" наиболее значимых битов. Результат затем обрабатывается как значение целевого типа.
Если исходный тип меньше конечного типа, то исходное значение расширяется с помощью знака или нуля, чтобы оно было того же размера, как целевой тип. Расширение знака используется, если исходный тип имеет знак; расширение нулём используется, если исходный тип без знака. Результат затем обрабатывается как значение целевого типа.
Если исходный тип совпадает с типом назначения, то исходное значение рассматривается как значение целевого типа.
При преобразовании значения в целочисленный
decimalтип это значение округляется до нуля до ближайшего целочисленного значения. Если результирующее целочисленное значение выходит за пределы диапазона целевого типа, OverflowException создается исключение.При преобразовании
doubleилиfloatзначении в целочисленный тип это значение округляется до нуля до ближайшего целочисленного значения. Если результирующее целочисленное значение находится вне диапазона целевого типа, результат зависит от контекста проверки переполнения. В проверяемом контексте создается исключение, в то время как в незавершенном контексте OverflowException результат является неопределенным значением целевого типа.При преобразовании
doublefloatвdoubleзначение округляется до ближайшегоfloatзначения.doubleЕсли значение слишком мало или слишком большое, чтобы поместиться вfloatтип, результат равен нулю или бесконечности.При преобразовании
floatилиdoubledecimalпереходе исходное значение преобразуется вdecimalпредставление и округляется до ближайшего числа после 28-го десятичного разряда при необходимости. В зависимости от значения исходного значения может произойти одно из следующих результатов:Если исходное значение слишком мало для представления в виде
decimal, результат становится нулевым.Если исходное значение — NaN (не число), бесконечность или слишком большое значение, которое должно быть представлено как
decimal, OverflowException вызывается.
При преобразовании
decimalfloatв илиdouble, исходное значение округляется до ближайшегоfloatилиdoubleзначения соответственно.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#: