在c#中使用ush的bitShifting

mcm*_*lab 1 c# bit-manipulation

如果我想将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);
Run Code Online (Sandbox Code Playgroud)

然后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));
Run Code Online (Sandbox Code Playgroud)

导致大的uints过度.

Eli*_*nti 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));
Run Code Online (Sandbox Code Playgroud)

例外:

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));
}
Run Code Online (Sandbox Code Playgroud)

没有例外

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

确保您没有使用/ checked选项进行编译.

从int转换为uint会抛出异常.在字节上使用shift运算符(使用uint u3 = ...的行)将它们隐式地转换为int.MSB打开("1")的uint是负int,超出uint的范围.使用int不会导致此类异常,因为没有可能引发溢出异常的显式强制转换.