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));

导致大单位溢出。

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 是负 int,超出 uint 的范围。使用 int 不会导致此类异常,因为没有可能引发溢出异常的显式强制转换。

于 2012-12-11T04:22:43.933 回答
0

我使用最高 4,294,967,295 的 uint 值运行您的代码,这是最大值,并且在所有情况下都可以正常工作。

于 2012-12-11T04:21:26.657 回答