2011-05-17 13 views
7

Selamlar dönüştürülebilir olamaz, ama o kadar işte burada mantıklı değil:). aşağıdaki gibi Windows Phone 7/.net C# 'da C# - Sabit değer '4294901760'</p> <p>Ben böyle bir temel soru soruyorum inanamıyorum, bir 'int'

, bir sınıfta bir sabit tanımlamak çalışıyorum:

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

ben şöyle etrafına dökülen bir (int) koyarsanız, ben olsun başka hatası:

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

Ama benim int dolayısıyla 32-bit 2,147,483,647 için -2,147,483,648 bir dizi sahip olduğunu biliyoruz, http://msdn.microsoft.com/en-us/library/5kzh1b5w(v=vs.80).aspx

Peki verir görüyor musunuz?

Şimdiden teşekkürler!

domuz notu gibi

cevap

16

, Int32 aralığı, böylece aralık içinde herhangi bir sayıda tutulabilir 2,147,483,647 için -2147483648, ama bu aralık içinde SADECE numaralar tutulabilir. 4,294,901,760, 2,147,483,647'den büyüktür, bu nedenle Int32'a sığmaz. Bu konuda ne

elde etmek istediğinize bağlıdır.

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

y şimdi imzalı bir tamsayı olarak yorumlanır Sinirin kalıptır değeri -65536 sahiptir: kullanılmasını unchecked önerildiği gibi sadece, sonra biraz deseni ffff0000 ile Int32 istiyorum.

Ancak! böylece UInt32 - aslında değer istiyorsanız 4294901760 buna uygun bir veri türü kullanmalıdır.

+0

Evet. Geç olmalı! Yani ... eğer işaretlenmemiş kullanırsam, değeri koruyacak mıyım yoksa verileri koruyacak mı? – swinefeaster

+0

http://msdn.microsoft.com/en-us/library/a569z7k8%28v=vs.71%29.aspx. Yani: Denetlenmeyen bir bağlamda, bir ifade hedef türünün aralığı dışında bir değer üretirse, sonuç kesilir. – VikciaR

+0

@Vik bu sayfa biraz yanıltıcıdır (en son sürüm daha iyidir) - burada datatypes aynı boyutta olduğundan, gerçekten 'kesik' değil – AakashM

4

int -2,147,483,648 dan 2,147,483,647 arasında değişen imzalı bir tam sayıdır. Ne istiyorsun
birinci hata mesajı anlatır gibi, işaretsiz tamsayı, yani uint olduğunu. derleyici mesajla önerdiği gibi kontrolsüz kullanılarak

2

Dene:

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

Bu imzalı int olarak yorumlanır 0xffff0000 olduğu -65536 gibi RED tanımlar.

2
public const uint RED = 0xffff0000; 
1

Bu kontrolsüz etrafında almalısınız: tabii

public const int RED = 0xffff << 16; 
İlgili konular