1

4バイトをintに変換したい場合は、次のように実行できます。

        byte[] b = BitConverter.GetBytes(i1);
        int i2 = BitConverter.ToInt32(b,0);
        int i3 = b[0] | (b[1]<<8) | (b[2]<<16) | (b[3]<<24);

そして、i1、i2、i3はすべて等しくなります。

しかし、どうすればuintに対して同じことを行うことができますか?これ:

        uint u1 = uint.MaxValue-1000;
        byte[] b = BitConverter.GetBytes(u1);
        uint u2 = BitConverter.ToUInt32(b,0);
        uint u3 = (uint)(b[0] | (b[1]<<8) | (b[2]<<16) | (b[3]<<24));

大きなuintのオーバーフローが発生します。

4

2 に答える 2

5

チェックされたコンテキストにある場合にのみ、その例外をスローします。http://msdn.microsoft.com/en-us/library/y3d0kef1(v=vs.80).aspxを参照してください。

例外なし:

uint u1 = uint.MaxValue - 1000;
byte[] b = BitConverter.GetBytes(u1);
uint u2 = BitConverter.ToUInt32(b, 0);
uint u3 = (uint) (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24));

例外:

checked
{
    uint u1 = uint.MaxValue - 1000;
    byte[] b = BitConverter.GetBytes(u1);
    uint u2 = BitConverter.ToUInt32(b, 0);
    uint u3 = (uint) (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24));
}

例外なし

checked
{
    unchecked
    {
        uint u1 = uint.MaxValue - 1000;

        byte[] b = BitConverter.GetBytes(u1);
        uint u2 = BitConverter.ToUInt32(b, 0);
        uint u3 = (uint) (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24));

        Console.WriteLine(u1 + " " + u2 + " " + u3);
    }
}

/checkedオプションを使用してコンパイルしていないことを確認してください。

例外は、intからuintにキャストすることによってスローされます。バイト(uint u3 = ...の行)でシフト演算子を使用すると、暗黙的にそれらをintにキャストします。MSBがオン( "1")のuintは、uintの範囲外の負のintです。オーバーフロー例外を誘発する可能性のある明示的なキャストがないため、intを使用してもそのような例外は発生しません。

于 2012-12-11T04:22:43.933 に答える
0

最大4,294,967,295のuint値を使用してコードを実行しましたが、これはすべての場合に正常に機能します。

于 2012-12-11T04:21:26.657 に答える