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

См. также