zoukankan      html  css  js  c++  java
  • 使用checked语句防止数据溢出

    今天做开发的时候,遇到了一个问题比较有意思:

    我在程序中定了一个值:Int64 t = 50 * 1024 * 1024 * 1024;  按说没什么特殊的,结果编译器直接报错:

    严重性 代码 说明 项目 文件 行 禁止显示状态  错误 CS0220 在 checked 模式下,运算在编译时溢出 xxx.cs 317 活动的

    然后有查看了别人写的代码,其中有个人这样写的:Int64 t = unchecked(50 * 1024 * 1024 * 1024);  于是比较好奇,平时也没用过过这个unchecked关键字,于是查查看。

    使用checked语句防止数据溢出

    在C#中有一个关键字checked,它用来判断当前上下文中的数值运算和数值转换是否会溢出。如是是常量溢出,那在编译时就能发现;如果是变量溢出,那在运行时会抛出OverflowException。

    数值运算有:++   —   - (unary)   +   -   *   /

    有了这个就不用担心数据溢出了。

    checked

    checked 有两种使用方法:

    1.作为操作符来使用

    int a = int.MinValue;
    int c = checked(a--);

    执行的时候会抛出异常:

    image

    2.检查一大块代码

    这样子会对里面所有的代码都做检查

    checked
    {
        int a = int.MinValue;
        int c = a--;
    }

    如下图:

    image

     

    unchecked

    和checked对应,还有一个unchecked关键字,用来取消检查。

    也是两种使用;

    1.作为运算符

    int a = int.MinValue;
    int c = unchecked(a--);

    这样子就不会抛异常了

    image

    2.检查一大块代码

    unchecked
    {
        int a = int.MinValue;
        int c = a--;
    }

    也不抛异常:

    image

    /checked 和/checked-


    如果代码里总是要写这么多checked语句是不是很烦?如果能有一个编译参数就好,只有设置了就都会检查。微软也想到了这个,它提供了一个/checked 参数来做,也提供了一个/checked-来取消。

    • 溢出检查 /checked,也可以是/checked+
    • 溢出不检查 /checked-

    当然,你想取消所有的检查也是可以的,命令行参数是/checked-

    csc t2.cs /checked

    其中csc是编译器csc.exe , t2.cs 是被编译的代码文件。

    我想很多人是用Visual Studio吧。VS里也是可以设置的。

    步骤如下,我以VS2010为例,(VS2005,2008差不多)

    1。在工程上点右键,选择菜单Properties

    image

    2。点击“Build”,再点击“Advanced”

    image

    3。在打开的对话框中,把“Check for arithmetic overflow/underflow”打上勾

    image

    几个注意

    1.checked语句只对当前上下文中的代码有效,即不对调用的函数内部做检查

    static void Main(string[] args)
    {
        checked
        {
            TestFun();
        }
    
    }
    
    static void TestFun()
    {
        int a = int.MinValue;
        int c = a--;
    }

    这段代码中。不会跑异常,因为checked关键字没有影响到TestFun内部。如果需要这么做的话,要么在TestFun内部加checked关键字,要么打开全局开关(加编译参数/checked或者VS中设置)。

    2.checked,unchecked关键字不检查左移和右移是否溢出。

    static void Main(string[] args)
    {
        checked
        {
            int a = int.MinValue;
            int c = a>>1;
        }
    
    }

    执行不会抛异常:

    image

    3.为了性能考虑,建议Debug时做检查,Release时不做检查。

    参考资料

    /checked (Check Integer Arithmetic)

    http://msdn.microsoft.com/en-us/library/h25wtyxf(v=VS.71).aspx

    Arithmetic Overflow Checking using checked/unchecked

    http://www.codeproject.com/KB/cs/overflow_checking.aspx

    C# 3.0 in a Nutshell, 3rd Edition

    Chapter 2.4.5.2. Integral overflow

    出处:https://www.cnblogs.com/greenerycn/archive/2010/07/23/use_checked_to_avoid_overflow.html

    您的资助是我最大的动力!
    金额随意,欢迎来赏!
    款后有任何问题请给我留言。

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我。(●'◡'●)

    如果你觉得本篇文章对你有所帮助,请给予我更多的鼓励,求打             付款后有任何问题请给我留言!!!

    因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【Jack_孟】!

  • 相关阅读:
    nsis打包
    学习记录:ST表
    学习记录:快速幂
    学习记录:哈夫曼树
    学习记录:二叉树
    学习记录:康托展开 与 逆康托展开
    堆排序简介
    动态规划水题集
    lower_bound( ) 与 upper_bound( )
    琐碎的一点技巧
  • 原文地址:https://www.cnblogs.com/mq0036/p/14345004.html
Copyright © 2011-2022 走看看