2016-03-31 24 views
0

İki değişkenim var.Neden int uint'ten çıkaramıyorum?

int x = 1; 
uint y = 2; 

tip int ve uint kalmalıdır. Ancak onlarla temel aritmetik yapılamıyorum.

y += x; 

dolaylı 'uint' tip 'int' dönüştürülemez. Açık dönüştürme (bir döküm eksik?)

Yani bu her şey gibi bir şey yapmak zorunda var?

if (x < 0) 
{ 
    y -= (uint)Math.Abs(x); 
} 
else 
{ 
    y += (uint)x; 
} 

C/C++/Java arka planından gelince, bu beni şaşırtıyor.
Burada eksik olduğum bir şey var mı?

Bu davranış neden bahsedilen diğer dillerden farklı?
Daha iyi alternatifler var mı?

Bu, dilin yeni gelenleri için ortak bir yolculuk olduğunu varsayalım.
Hayır, alt akışına güvenmiyorum.

+1

'gerçekleştirmek için gerçekleştirilmelidir. Bu dönüşüm kayıp derleyici olduğundan, bunu açıkça gerçekleştirmenizi gerektirir. – MarcinJuraszek

cevap

2

Bir int'un uint'a sığacağı garanti edilmez, bu nedenle derleyici hatasını alırsınız.

İşlemi gerçekten gerçekleştirmek istiyorsanız (yani, numaraların uygun olacağını biliyorsanız), Convert yöntemlerini kullandığınız gibi kullanabilir veya kullanabilirsiniz. Eğer numaralar uyacak olmadığından emin değilseniz

if (x < 0) 
{ 
    y -= Convert.ToUint32(Math.Abs(x)); 
} 
else 
{ 
    y += Convert.ToUint32(x); 
} 

, sadece onları kelepçe olabilir:

uint result = Math.Max(uint.MinValue(Math.Min(uint.MaxValue, x)) 

Ayrıca, bazı durumlarda bir unchecked bağlam kullanabilirsiniz. Bu size hata vermez, ancak sığması mümkün olandan daha büyük değerler taşacaktır. Sonunda

, sen olası değerler onların aralığında haritasına ofset olarak int.MaxValue kullanmak istiyorsanız: y = x` int` `dan bir dönüşüm` için uint` vardır +

uint x = someuint(); 
int y = Convert.ToInt32(x - int.MaxValue); 

int w = someint(); 
uint z = Convert.ToUint32(w + int.MaxValue); 
+0

Int kullanamıyorum çünkü negatif olabilir veya taşmaya neden olabilir, ancak yine de başka bir uint ve case underflow kullanabilirim? Bunlar System.Int32 ve System.UInt32'dir. Aynı büyüklükte oldukları garanti ediliyor mu? –

+0

Bunlar bit boyutunda aynı boyuttadır, ancak aynı sayısal değerleri temsil etmezler. Örneğin -1'i Uint32 olarak temsil edemezsiniz. Ancak, istediğiniz tek şey, aralarında _map_ ise, o zaman, biri diğerinin temsil edilebilir aralığının yarısını kapsayan “int.MaxValue” öğesini ekleyerek veya çıkararak bir "vardiya" uygulayabilirsiniz. – heltonbiker