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


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

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#:

См. также