2010-04-15 74 views
6

我有以下函數來獲得從高字節和低字節的int:爲什麼FxCop在這個C#代碼中有關溢出(CA2233)的警告?

public static int FromBytes(byte high, byte low) 
{ 
    return high * (byte.MaxValue + 1) + low; 
} 

當我分析組件,的FxCop,我得到以下嚴重警告:

CA2233:操作不應該溢出
如果不首先驗證 操作數以防止溢出,則算術運算不應該爲 。

我看不出這可能會溢出,所以我只是假設FxCop是過度熱情。
我錯過了什麼嗎?並且可以採取哪些措施來糾正我所擁有的(或者至少讓FxCop警告消失!)?

+1

我打賭是在「byte.MaxValue + 1」部分。 – Pwninstein 2010-04-15 01:36:27

+4

您的投注是錯誤的。他的代碼不會導致溢出,因爲在添加步驟發生之前,byte.MaxValue總是隱式轉換爲int。 - 任何時候,一個方法執行一個算術運算,並且不事先驗證操作數(以防止溢出),您將得到CA2233。有很多關於如何在MSDN上修復此問題的示例,地址爲:http://msdn.microsoft.com/en-us/library/ms182354.aspx – BrainSlugs83 2012-01-09 04:43:57

+0

閱讀http://msdn.microsoft.com/en-us/library/ ms182354.aspx – Lijo 2012-11-19 07:27:59

回答

3

作爲Daniel A. Whitepointed out,你得到的消息,因爲 「(byte.MaxValue + 1)」 溢出一個字節。但是,鑄造和乘法,而不是

,我只想位如下面的代碼進行轉移:

public static int FromBytes(byte high, byte low) { 
    return high << 8 | low; 
} 

作爲一個副作用,此代碼可能會表現得更好。我沒有檢查生成的IL或x86以查看編譯器和/或JITter是否足夠聰明以優化原始表達式。

+4

再次,byte.MaxValue + 1不會溢出字節。他得到的消息是因爲他沒有驗證他的操作數。因爲你的代碼不執行任何算術運算,所以它只能用二進制邏輯。有關更多詳細信息,請參閱http://msdn.microsoft.com/en-us/library/ms182354.aspx。 – BrainSlugs83 2012-01-09 04:45:36

5

它正在做他們作爲字節計算。

試試這個

return (int)high * ((int)byte.MaxValue + 1) + (int)low; 
+0

+1我只是想用同樣的東西回答:) – Pwninstein 2010-04-15 01:37:47

+0

我正要寫這篇文章!好而快。 :) – Joshua 2010-04-15 01:39:33

+1

-1! (如果我可以!)這是不正確的。您不需要將byte.MaxValue轉換爲整數 - 當您添加整數和字節時 - 該字節將自動轉換爲整數 - 這是隱式轉換的全部要點。 爲證明,請注意:public static int GetValue(){return Byte.MaxValue + 1}返回值256. Byte + Int = Int。 此外,請注意,您提供的代碼不會使CA2233 FxCop警告消失。簡單地說(我+ 1)(其中我是一個int)將導致此警告。 – BrainSlugs83 2012-01-09 04:40:10

3

這裏有2種方式,它最終停止抱怨CA2233對我來說:

public static int FromBytes(byte high, byte low) 
    { 
     int h = high; 
     return h * (byte.MaxValue + 1) + low; 
    } 

    public static int FromBytes2(byte high, byte low) 
    { 
     unchecked 
     { 
      return high * (byte.MaxValue + 1) + low; 
     } 
    } 

我想可能是在規則中的錯誤。

4

字節加和多結果是整數。這裏的最大值是65535,它不會溢出int。只要抑制錯誤。

byte a = 1; 
byte b = 2; 
object obj = a + b 

的obj的類型爲int

試試這個:

 byte high = 255; 
     byte low = 255; 
     checked 
     { 
      int b = high * (byte.MaxValue + 1) + low; 
     } 

沒問題。

或試試這個

相關問題