記得以前玩游戲的時候,積攢下來的金幣越來越多。看着那個數字長呀、長呀,突然有一天,我的錢莫名其妙的變成了負數!真是悲劇。
走上了軟件開發這條路之后,知道了,這叫做“溢出”。做了這么多年的開發,說實話,還真的沒有在程序中特別注意過溢出的檢查。
所以,今天把它寫出來,就算是提醒一下自己和跟我一樣沒有注意過這個問題的朋友們吧。
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(); } } }
