• 【微软技术栈】C#.NET 内置数值转换


    本文内容

    1. 隐式数值转换
    2. 显式数值转换

    C# 提供了一组整型浮点数值类型。 任何两种数值类型之间都可以进行隐式或显式转换。 必须使用强制转换表达式来执行显式转换。

    1、隐式数值转换

    下表显示内置数值类型之间的预定义隐式转换:

    From
    sbyteshortintlongfloatdoubledecimal 或 nint
    byteshortushortintuintlongulongfloatdoubledecimalnint 或 nuint
    shortintlongfloatdoubledecimal 或 nint
    ushortintuintlongulongfloatdoubledecimalnint 或 nuint
    intlongfloatdoubledecimal 或 nint
    uintlongulongfloatdoubledecimal 或 nuint
    longfloatdouble 或 decimal
    ulongfloatdouble 或 decimal
    floatdouble
    nintlongfloatdouble 或 decimal
    nuintulongfloatdouble 或 decimal

    从 intuintlongulongnint 或 nuint 到 float 的隐式转换以及从 longulongnint 或 nuint 到 double 的隐式转换可能会丢失精准率,但绝不会丢失一个数量级。 其他隐式数值转换不会丢失任何信息。

    注意:

    • 任何整型数值类型都可以隐式转换为任何浮点数值类型

    • 不存在针对 byte 和 sbyte 类型的隐式转换。 不存在从 double 和 decimal 类型的隐式转换。

    • decimal 类型和 float 或 double 类型之间不存在隐式转换。

    • 类型 int 的常量表达式的值(例如,由整数文本所表示的值)如果在目标类型的范围内,则可隐式转换为 sbytebyteshortushortuintulongnint 或 nuint

      1. byte a = 13;
      2. byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'

      如前面的示例所示,如果该常量值不在目标类型的范围内,则发生编译器错误 CS0031

    2、显式数值转换

    下表显示不存在隐式转换的内置数值类型之间的预定义显式转换:

    From
    sbytebyteushortuintulong 或 nuint
    bytesbyte
    shortsbytebyteushortuintulong 或 nuint
    ushortsbytebyte 或 short
    intsbytebyteshortushortuintulong 或 nuint
    uintsbytebyteshortushortint 或 nint
    longsbytebyteshortushortintuintulongnint 或 nuint
    ulongsbytebyteshortushortintuintlongnint 或 nuint
    floatsbytebyteshortushortintuintlongulongdecimalnint 或 nuint
    doublesbytebyteshortushortintuintlongulongfloatdecimalnint 或 nuint
    decimalsbytebyteshortushortintuintlongulongfloatdoublenint 或 nuint
    nintsbytebyteshortushortintuintulong 或 nuint
    nuintsbytebyteshortushortintuintlong 或 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 值。

  • 相关阅读:
    pdf文档转word文档
    在Linux中搭建Python环境
    web前端期末大作业 HTML+CSS+JavaScript仿唯品会购物商城网页设计实例 企业网站制作
    LeetCode - Medium - 63. Unique Paths II
    Centos中清除因程序异常终止,导致的残留的Cache/buff_drop_caches命令---linux工作笔记063
    UniApp 在 iOS 16 下真机自定义基座调试指南,可解决模拟器无法输出调试日志问题
    桌面云组件介绍与安装
    面试题1(京东)之HiveSql --- 难度:入门初级
    Java8新特性之Lambda表达式
    云计算系统与传统计算系统的比较
  • 原文地址:https://blog.csdn.net/m0_51887793/article/details/134497792