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过度.
如果在已检查的上下文中,它只会抛出该异常.请参阅: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不会导致此类异常,因为没有可能引发溢出异常的显式强制转换.