Встроенные числовые преобразования (справочник по 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#: