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