2012-12-11 33 views
1

如果我要4個字節轉換成一個int,我可以這樣做:BitShifting爲UINT在C#

 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。

+0

你有什麼異常? – Dai

+0

System.OverflowException:算術運算導致溢出。 – mcmillab

+0

我不明白它爲什麼會拋出異常。不要在這裏爲uint.MaxValue和uint.MaxValue拋出一個異常 - 100.你得到這個異常的值是什麼,什麼行? –

回答

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

確保你不使用/編譯檢查選項。

通過從int轉換爲uint引發異常。在字節上使用移位運算符(uint = 3的行)將它們隱式轉換爲int。帶有MSB的uint(「1」)是一個負值,它超出了uint的範圍。使用int不會導致這樣的異常,因爲沒有可能引發溢出異常的顯式轉換。

+0

謝謝,這就是答案 – mcmillab

0

我運行你的代碼,uint值高達4,294,967,295,這是最大的,它在任何情況下都能正常工作。