zoukankan      html  css  js  c++  java
  • C# 中的隐式类型转换(运算时的隐式转换)和显示类型转换

    区别:

    1. 隐式转换失败编译会报错。
    2. 显示转换有可能精度丢失。
    3. 根据项目的编译设置,显示转换溢出可能会报错,如果设置溢出且未使用checked检查,运行时如果发生溢出会产出未知的计算结果。
    4. 在数字运算时,会有默认的隐式转换

    一、隐式转换
      val1 = val2; // 写法简单。即 一个变量val2 赋给 另一个变量val1

      从小范围到大范围。如 byte的取值范围是 0 ~ 255, short的范围是 0~32677 所以 byte类型的变量 a 可以赋给 short类型的变量b。

       反之 short 类型的赋给 byte 编译会报错。如果非要转的话 就用到 显式转换(强制转换)。

    二、显式转换
      格式:
        1.类型 valA = (类型2) valB;
        2.类型 valA = Convert.To类型2(valB);

      1) 强制转换会有精度丢失的问题。
      如
        short shortNum = 281;
        byte byteVal = (byte)shortNum;// byte 会赋值 25
        // 因为 281 = 1,0001,1001
        // 25 = 0,0001,1001
        // 255 =  0,1111,1111
        // 即 255最多取 8位,从第9位开始就舍弃了。


      2)用 checked关键字 检测是否溢出。
      如
        short shortNum = 281;
        byte byteVal = checked((byte) shortNum); // 运行到该行会报错。"Arithmetic operation resulted in an overflow."

        unchecked关键字 表示忽略溢出检查,和 checked写法类似。
      3)

        System.Convert.ToXXX(val); // 转换基本类型,都会执行溢出检测(即效果类似默认都加了 checked 判断)

    三、运算时的默认隐式转换 
      如 两个 short 相乘的结果 很大概率超过 short 上限,所以返回的结果是 int 类型的。
      doubleRe = floatVal + (shortVal * floatVal);
      混合运算时,根据运算优先级
        1)计算 * ,将 shortVal 转换成 float 类型
        2)计算 + ,float 和 float 相加不会类型转换。
        3)= 时,将结果转换为 double。


      查看变量类型可以用 val.GetType() 函数。

  • 相关阅读:
    C#代码控制tfs
    WindowService 执行命令
    自定义服务端Script控件支持javascript服务端路径?
    asp.net 实现LRC歌词播放
    asp.net ajax使用方法一
    左右两列布局
    XML反序列化一例
    自定义配置节备忘
    使用WTSGetActiveConsoleSessionId()的VISTA服务与桌面交互
    Java web 学习
  • 原文地址:https://www.cnblogs.com/sweetXiaoma/p/8661897.html
Copyright © 2011-2022 走看看