当前位置:编程学习 > 网站相关 >>

你可曾遇到过溢出带来的悲剧?

记得以前玩游戏的时候,积攒下来的金币越来越多。看着那个数字长呀、长呀,突然有一天,我的钱莫名其妙的变成了负数!真是悲剧。

走上了软件开发这条路之后,知道了,这叫做“溢出”。做了这么多年的开发,说实话,还真的没有在程序易做图别注意过溢出的检查。

所以,今天把它写出来,就算是提醒一下自己和跟我一样没有注意过这个问题的朋友们吧。

1、溢出现象

做开发的人,应该都知道什么是溢出,这里就不说关于多溢出的基础知识了,简单看一下下图,变量int3变成了负数。

\

2、溢出检查

怎么样才能避免这种错误的发生呢?在c#中可以用“checked”关键字对可能发生溢出的代码段进行溢出检查。如果“checked”包含的代码段中发生溢出时,将会报异常。

看到下面这张图了吧,同样的代码,加了一个“checked”,就运行不过去了,自己加上一个try catch处理一下吧。

\

3、统一设置溢出检查

坦白的说,我是一个懒人,我才不想一个地方、一个地方的去找、去加“checked”呢,万一少遗漏了一个地方,那麻烦不就大了吗?

有没有统一设置的地方,设置一次,所有代码都进行溢出检查呢?呵呵,有的。

在项目属性里,依次进入,生成-->高级,再勾选“检查运算符上溢/下溢”,就好了。

\

看到了吧,没有加“checked”,照样报了异常

\

3、溢出检查的性能损失

下面的列表显示了,一段相同的代码,在检查和不检查溢出的运行耗时。可以看出,两者性能相差7.81%。

好了,不多说了,是节约这7.81%的性能,还是保证运算的准确行,根据实际情况,具体分析吧。

    运行耗时
检查溢出 1 "00:00:03.4962992"
2 "00:00:03.5251535"
3 "00:00:03.5164421"
不检查溢出 1 "00:00:03.2255009"
2 "00:00:03.2309986"
3 "00:00:03.2580578"

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
            timer.Start();
            var count = 0;
            for (int i = 0; i < 1000000000; i++)
            {
                count++;
            }
            timer.Stop();
            var str = timer.Elapsed.ToString();
        }
    }
}

 

============================================
我的开源项目,都是平时的积累,对提高开发效率很有帮助。
http://lmcommon.codeplex.com/

补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,