2011-10-19 8 views
2

誰かがOverflowExceptionを説明できるかどうかは私には分かりますが、私は見ています。 (byteからdecimalをキャストする場合)私は最後の行にOverflowExceptionがを得るなぜ、OverflowExceptionsは、uint-> byteではなく、decimal-> byte変換で起こりますか?

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

は、次のコードを考えてみましょう。 uintに同じ値をキャストしてbyteに設定したときには取得できません。

なぜこのようなケースかわかりません。助言がありますか?

答えて

4

小数点がバイト(0〜255)の範囲外にある場合、小数点から1バイトへの明示的な変換はdocumented to throw this exceptionです。

オーバーフロー例外:値がByte.MinValueより小さいか、 Byte.MaxValueより大きい。

、2行目には、あなたは値が黙ってラップしていることに気付かれるべき、wilmaは0であるので、その法的な変換でデータ損失があります。上記と同じ振る舞いがuint-to-byte積分変換で表示されるようにするには、チェックされたコンテキストで実行します。

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

未チェックのコンテキストでは、整数型間の変換ではオーバーフローが無視されます。高位ビットは破棄されます。 (参照:C#言語仕様のセクション4.1.5)を

確認及び未確認オペレータやステートメントは一体型の算術演算及び コンバージョン(§7.6.12)をチェック オーバーフローを制御するために使用されます。チェックされたコンテキストでは、オーバーフローによって コンパイル時エラーが発生するか、System.OverflowExceptionがスローされます。 チェックされていないコンテキストでは、オーバーフローは無視され、宛先タイプに適合しない上位ビットのビット は破棄されます。

これらの問題を回避するために、保存するデータに適したタイプを使用してください。データがbyteの範囲を超える場合、はより大きなタイプのを使用します。整数型と浮動小数点数の間の変換は、後者の値の範囲が整数の範囲をはるかに超えることがあり、もちろん小数点以下のデータの損失は避けられないため、特に問題があります。

ただし、十進数からバイトへの変換を継続して使用する場合は、byteの最小値と最大値を念頭に置いて(比較する)必要があります。

関連する問題