2011-05-17 28 views
7

問候,C# - 恆定值「4294901760」不能轉換爲「廉政」

我不能相信我在問這樣一個基本的問題,但它沒有任何意義所以在這裏,它是: )。

在C#在Windows Phone 7/.NET,我想在一個類中定義常量如下:

// error CS0266: Cannot implicitly convert type 'uint' to 'int'. 
// An explicit conversion exists (are you missing a cast?) 
public const int RED = 0xffff0000; 

如果我把一個(INT)周圍鑄像這樣,我得到另一個錯誤:

// error CS0221: Constant value '4294901760' cannot be converted to a 'int' 
// (use 'unchecked' syntax to override)   
public const int RED = (int)0xffff0000; 

但我知道,我的int是32位的,所以有一系列的-2,147,483,648到2,147,483,647,看到http://msdn.microsoft.com/en-us/library/5kzh1b5w(v=vs.80).aspx

那麼是什麼原因?

在此先感謝!

回答

16

正如你注意到的Int32範圍爲-2,147,483,648到2,147,483,647,因此可以認爲範圍內的任何數字,但該範圍內的只有數字可以舉行。 4,294,901,760大於2,147,483,647,因此不適合Int32

如何處理這取決於你想達到什麼。如果你只是想與位模式ffff0000Int32,然後根據提示使用unchecked

int y = unchecked((int)0xffff0000); 

y目前擁有價值-65536,這被解釋爲一個有符號整數位模式。

但是!如果你真的想要價值4,294,901,760你應該使用適合它的數據類型 - 所以UInt32

+0

是。必須遲到!所以...如果我使用unchecked,將C#截斷值或包裝它,保存數據? – swinefeaster 2011-05-17 07:29:42

+0

http://msdn.microsoft.com/en-us/library/a569z7k8%28v=vs.71%29.aspx。因此:在未經檢查的上下文中,如果表達式產生的值超出目標類型的範圍,則結果將被截斷。 – VikciaR 2011-05-17 07:37:16

+0

@Vik該頁有點誤導(最新版本更好) - 因爲這裏的數據類型是相同的大小,它不是真的'截' – AakashM 2011-05-17 07:40:59

4

int是一個有符號整數,範圍從-2,147,483,648到2,147,483,647。
你想要的是一個無符號整數,即uint,就像第一個錯誤消息告訴你的一樣。

2

嘗試通過編譯消息的建議使用未選中:

public const int RED = unchecked((int)0xffff0000); 

RED定義爲-65536,其爲0xffff0000解釋爲符號int。

2
public const uint RED = 0xffff0000; 
1

這應該讓你周圍的未選中:

當然
public const int RED = 0xffff << 16; 
相關問題