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 進数からバイトへの変換を行う場合は、バイトの最小値と最大値を念頭に置いて比較する必要があります。