zoukankan      html  css  js  c++  java
  • C#中对byte类型的处理。

    可能很多人都没有注意到,C#中对byte类型的处理还是很特殊的。

    下面我用几行简单的代码来说明问题

    byte x=1;

    byte y=2;

    byte z=x+y;  //error:无法将int类型转换为byte类型

    可能很多人会认为这段代码没有问题,实际上第三行会产生编译错误:无法将int类型转换为byte类型!

    这是为什么呢?因为C#编译器会认为byte类型和byte类型运算的结果是int型,实际上对short类型也做了相似的处理。

    至于为什么这样设计,我的看法是byte或short类型相互运算比较容易发生溢出,所以在运算的时候直接都转换为int来运算了。

    再看下面的代码

    byte i=1;  //OK

    这里的字面值1是被编译器识别为int类型的,在以上声明中,整数 1int 类型隐式转换为 byte 类型。如果整数超出了 byte 类型的范围,则将发生编译错误。

    上面是MSDN中的说法,实际上这个隐式转换违背了范围小的类型可以隐式转换为范围大的类型这条规则,但是在C#中这个转换的确是合法的。

    注意这个转换只有用整型的字面值来赋值运算的时候才成立,像这样就不可以了:

    int x=1;

    byte i=x; //error: 无法将int类型转换为byte类型

    在看下面的代码:

    byte i=1;

    i+=1;  //OK

    这行代码是可以通过的,原因是C#中x+=y并不是总相当于x=x+y的!

    如果x+y的结果的类型可以隐式转换为x的类型,那么x+=y相当于x=x+y

    如果x+y的结果的类型可以显式转换为x的类型,并且x=y也合法,那么x+=y相当于x=(T)(x+y),其中T是x的类型。

    就像上面这行代码,i+1是int类型的,可以显式转换为byte类型,而i=1也合法,所以i+=1就相当于i=(byte)(i+1)

    i=i+1;  //error:无法将int类型转换为byte类型

    这行比较容易理解,1被编译器识别为int类型,所以i+1的结果是int类型的,无法将int类型转换为byte类型

  • 相关阅读:
    vs2013项目停止调试后 iis express也跟着退出
    windows使用bat文件定时备份文件
    javascript方法重载惹的祸
    Windows无法启动MySQL服务,错误1067
    mysql应用学习-解决数据乱码
    mysql应用学习-在cmd命令窗口下创建数据库和表
    mysql应用学习-windows(64位)安装和配置mysql(5.6.20)
    如何更新maven需要的jar包
    如何恢复sqlserver误删除的数据(摘)
    Centos安装图形化界面
  • 原文地址:https://www.cnblogs.com/xuefeng1982/p/1392433.html
Copyright © 2011-2022 走看看