2011-10-19 24 views
2

我想知道是否有人可以解釋我看到的OverflowException。爲什麼在發生小數字 - >字節轉換時會發生OverflowException,但不會發生uint-> byte?

考慮下面的代碼:

 uint fred = 32768; 
     byte wilma = (byte)fred; 
     decimal bamBam = fred; 
     wilma = (byte)bamBam; 

(鑄造decimalbyte時)我只在最後一行得到一個OverflowException異常。當在uint中將相同的值轉換爲byte時,我不明白。

我不明白爲什麼是這樣的情況。有什麼建議麼?

回答

4

從十進制到字節中的顯式轉換爲documented to throw this exception當小數是字節(0到255)的範圍之外。

溢出異常:值小於Byte.MinValue或大於 Byte.MaxValue。

而在第二行中,您應該注意到該值默默包裝,wilma爲0,因此在該合法轉換中存在數據丟失。如果您希望看到與uint-to-byte積分轉換相同的上述行爲,則可以在檢查的上下文中運行。

checked 
{ 
    uint fred = 32768; 
    byte wilma = (byte)fred; 
} 

在未經檢查的上下文中,整數類型之間的轉換被忽略。丟棄更高階的位。 (參見:C#語言規範的4.1.5節)

的選中和未選中運算符和語句被用於控制 溢出檢查積分型的算術運算和 轉換(§7.6.12)。在檢查的上下文中,溢出會產生編譯時錯誤或導致引發System.OverflowException。 在未檢查的上下文中,忽略溢出並丟棄不適合目標類型的任何高位 。

至於避免這些問題,請使用適合您要存儲的數據的類型。如果數據超出範圍byte,則使用較大的類型。積分類型和浮點數之間的轉換特別有問題,因爲後者值的範圍可能遠遠超過整數範圍,當然,帶小數點的數據丟失是不可避免的。

但是,如果繼續使用十進制到字節轉換操作,你需要牢記(和比較反對)的最小和字節的最大值。

相關問題