2

誰かが私が見ている OverflowException を説明できるかどうか疑問に思っています。

次のコードを検討してください。

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

最後の行でのみ OverflowException を取得します( adecimalを aにキャストする場合byte)。uintの同じ値を にキャストすると、取得できませんbyte

なぜそうなのか理解できません。助言がありますか?

4

1 に答える 1

4

10 進数からバイトへの明示的な変換は、10 進数がバイトの範囲 (0 から 255) の外にある場合にこの例外をスローするように文書化されています。

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

2 行目では、値が暗黙的にラップされ、0 になっていることに気付くはずですwilma。そのため、その正当な変換でデータが失われます。uint から byte への整数変換で上記と同じ動作を確認したい場合は、checked コンテキストで実行します。

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

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

チェック済みおよびチェックなしの演算子とステートメントは、整数型の算術演算と変換のオーバーフロー チェックを制御するために使用されます (§7.6.12)。チェックされたコンテキストでは、オーバーフローによってコンパイル時エラーが発生するか、System.OverflowException がスローされます。チェックされていないコンテキストでは、オーバーフローは無視され、宛先の型に収まらない上位ビットは破棄されます。

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

ただし、引き続き 10 進数からバイトへの変換を行う場合は、バイトの最小値と最大値を念頭に置いて比較する必要があります。

于 2011-10-19T22:37:41.483 に答える