Встроенные числовые преобразования (справочник по C#)
C# предоставляет набор целочисленных типов и типы с плавающей запятой. Существует преобразование между любыми двумя числовыми типами: неявное или явное. Для выполнения явного преобразования необходимо использовать выражение приведения.
Неявные числовые преобразования
В следующей таблице приведены предопределенные неявные преобразования между встроенными числовыми типами:
| С дт. | По |
|---|---|
| sbyte | short, int, long, float, double, decimal или nint |
| byte | short, ushort, int, uint, long, ulong, float, double, decimal, nint или nuint |
| short | int, long, float, double или decimal либо nint |
| ushort | int, uint, long, ulong, float, double или decimal, nint или nuint |
| int | long, float, double или decimal, nint |
| uint | long, ulong, float, double или decimal либо nuint |
| long | float, double или decimal |
| ulong | float, double или decimal |
| float | double |
| nint | long, float, double или decimal |
| nuint | ulong, float, double или decimal |
Примечание.
Неявные преобразования из int, uint, long, ulong, nint или nuint в float и из long, ulong, nint или nuint в double могут приводить к потере точности, но не к потере порядка величин. Другие неявные числовые преобразования никогда не теряют никаких сведений.
Также обратите внимание на следующее.
Любой целочисленный тип неявно преобразуется в любой числовой тип с плавающей запятой.
Не поддерживается неявное преобразование в типы
byteиsbyte. Не поддерживается неявное преобразование из типовdoubleиdecimal.Не поддерживается неявное преобразование между типом
decimalи типамиfloatилиdouble.Значение константного выражения типа
int(например, значение, представленное целочисленным литералом) может быть неявно преобразовано вsbyte,byte,short,ushort,uint,ulong,nintилиnuint, если оно находится в диапазоне целевого типа:byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'Как показано в предыдущем примере, если значение константы выходит за пределы диапазона целевого типа, возникает ошибка компилятора CS0031.
Явные числовые преобразования
В следующей таблице показаны предопределенные явные преобразования между встроенными числовыми типами, для которых нет неявного преобразования:
| С дт. | По |
|---|---|
| sbyte | byte, ushort, uint, ulong или nuint |
| byte | sbyte |
| short | sbyte, byte, ushort, uint, ulong или nuint |
| ushort | sbyte, byte или short |
| int | sbyte, byte, short, ushort, uint, ulong или nuint |
| uint | sbyte, byte, short, ushort, int или nint |
| long | sbyte, byte, short, ushort, int, uint, ulong, nint или nuint |
| ulong | sbyte, byte, short, ushort, int, uint, long, nint или nuint |
| float | sbyte, byte, short, ushort, int, uint, long, ulong, decimal, nint или nuint |
| double | sbyte, byte, short, ushort, int, uint, long, ulong, float, decimal, nint или nuint |
| десятичное | sbyte, byte, short, ushort, int, uint, long, ulong, float, double, nint или nuint |
| nint | sbyte, byte, short, ushort, int, uint, ulong или nuint |
| nuint | sbyte, byte, short, ushort, 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#:
См. также
Обратная связь
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделе https://aka.ms/ContentUserFeedback.
Отправить и просмотреть отзыв по