Поделиться через


Встроенные числовые преобразования (справочник по C#)

C# предоставляет набор целочисленных и числовых типов с плавающей запятой . Неявное или явное преобразование существует между двумя числовыми типами. Используйте выражение приведения для выполнения явного преобразования.

Справочные документы на языке C#, выпущенные последней версией языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.

Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.

Подсказка

Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей по журналу версий языка C#.

Неявные числовые преобразования

В следующей таблице показаны предопределенные неявные преобразования между встроенными числовыми типами:

От Кому
знаковый байт short, int, longfloatdoubledecimalилиnint
байт short, ushort, intuintlongulongfloatdoubledecimal, или nintnuint
короткие 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
длинный float, double или decimal
ulong float, double или decimal
float double
nint long, float, doubleили decimal
nuint ulong, float, doubleили decimal

Замечание

Неявные преобразования из int, , uint, nintulonglongили из , или nuintfloat из long, ulongnintили nuintdouble могут привести к потере точности, но никогда не потеря порядка величины. Другие неявные числовые преобразования никогда не теряют никаких сведений.

Кроме того, обратите внимание на то, что

  • Любой целочисленный числовый тип неявно преобразуется в любой числовый тип с плавающей запятой.

  • Неявные преобразования в byte и sbyte типы отсутствуют. Неявные преобразования из double и decimal типов отсутствуют.

  • Нет неявных преобразований между типом decimal и floatdouble типами.

  • Значение константного выражения типа int (например, значение, представленное целым литералом) может быть неявно преобразовано в sbyte, byte, , short, ushortnintuintulong, или 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, shortushortuintulongили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, shortushortintuintlongulongdecimal, или nintnuint
двойной sbyte, byte, shortushortintuintlongulongfloatdecimalnintилиnuint
десятичное sbyte, byte, shortushortintuintlongulongfloatdoublenintилиnuint
nint sbyte, byte, , shortushortintuintulongилиnuint
nuint sbyte, byte, , shortushortintuintlongили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#:

См. также