BinaryReaderからのネットワークバイトオーダー変換をどのように簡素化できますか? UInt32
質問の最初のコードは、との間の明示的なキャストの機能について考えさせましたInt32
。私の主な関心事は、 よりも大きいInt32.MaxValue
か小さい値です0
。
これらのキャストは同等である必要がありますが、一方は機能し、もう一方はエラーを引き起こします。
public static void TestConverstion()
{
// runs just fine, CastBack == aUInt
UInt32 aUInt = UInt32.MaxValue; // 4294967295
Int32 anInt = (Int32)aUInt; // -1
UInt32 castBack = (UInt32)aUInt; // 4294967295
// Build Error: Constant value '4294967295' cannot be converted to a 'int' (use 'unchecked' syntax to override)
UInt32 oneLineCastBack = (UInt32)(Int32)UInt32.MaxValue;
}
一方が有効で、もう一方が有効でないのはなぜですか?
このキャストの動作はどこに文書化されていますか? 私が見つけた最良のドキュメントはExplicit Numeric Conversions Table (C# Reference)で、明示的なキャストがあることを認めていますが、明示的なキャストは「精度が失われるか、例外がスローされる可能性がある」と警告しています。実験によると、例外はスローされず、精度も失われません。
UInt32 Structureは、共通言語仕様UInt32
の一部ではないため、 を使用して、より上で下にある値を表す必要がある場合はビットの半分を無駄にすることを示唆しています。Int64
Int32.MaxValue
UInt32.MaxValue