你可曾遇到過溢出帶來的悲劇?


記得以前玩游戲的時候,積攢下來的金幣越來越多。看着那個數字長呀、長呀,突然有一天,我的錢莫名其妙的變成了負數!真是悲劇。

走上了軟件開發這條路之后,知道了,這叫做“溢出”。做了這么多年的開發,說實話,還真的沒有在程序中特別注意過溢出的檢查。

所以,今天把它寫出來,就算是提醒一下自己和跟我一樣沒有注意過這個問題的朋友們吧。

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();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM