C # 'da uint'i int'e nasıl dönüştürürüm?


100

C # 'da uint'i int'e nasıl dönüştürürüm?


5
Bunu yaparsanız bir int'in değerini aşabileceğinizi unutmayın.
Powerlord

1
Evet, uint'in değeri Int32.MaxValue'dan büyükse (2,147,483,647 olur) nesnenizi kabul edilebilir bir duruma koyarak istisnayı incelikle ele aldığınızdan emin olmalısınız
Michael Meadows

Dönüştürmek güvenli olacaktır uinta longbir şekilde longtüm içerebilir uintbir gibi değerleri intdeğil (edebilirsiniz zaten belirtildiği üzere )
Liam

Yanıtlar:


187

Verilen:

 uint n = 3;

int i = checked((int)n); //throws OverflowException if n > Int32.MaxValue
int i = unchecked((int)n); //converts the bits only 
                           //i will be negative if n > Int32.MaxValue

int i = (int)n; //same behavior as unchecked

veya

int i = Convert.ToInt32(n); //same behavior as checked

--DÜZENLE

Kenan EK tarafından belirtildiği gibi dahil edilen bilgiler


4
Bu uintdeğerden büyükse int.MaxValue, bir cast kullanırsanız negatif bir sonuç veya kullanırsanız bir istisna elde edeceğinizi unutmayın Convert.ToInt32.
LukeH

4
Bu da Convert.ToInt32'yi daha iyi bir seçim imo yapar.
mmcdole

4
@Luke - Hayır, mutlaka değil. Yayınlarken, varsayılan olarak işaretli mi yoksa denetlenmemiş aritmentik mi olduğu konusunda proje oluşturma ayarlarınıza bağlıdır. Ek olarak, işaretlenmiş ve işaretlenmemiş anahtar kelimeleri kullanarak bunu yerel olarak değiştirebilirsiniz.
Greg Beech

@Greg: Bu doğru, ancak varsayılan hazır ayar işaretlenmemiş.
LukeH

@GregBeech Bu davranış taşınabilir mi? kontrolsüz yaklaşım durumunda ??

12

checkedVe uncheckedanahtar kelimelerine dikkat edin .

Sonucun int olarak kesilmesini veya sonuç işaretli 32 bite uymuyorsa bir istisnanın ortaya çıkmasını istiyorsanız önemlidir. Varsayılan işaretli değildir.


2
Varsayılanın işaretli olmadığına inanıyorum. Bunu işaret etmek için +1 - hata ayıklaması zor hataların kaynağı.

Haklısın benim hatam teşekkürler - "Bu seçenek için varsayılan değer / işaretlidir-"
Kenan EK

İşaretlenmemiş, "kesilmez".
fractor

10

32 bitleri bir türden kaldırıp diğer türe olduğu gibi dökmek istediğinizi varsayarsak:

uint asUint = unchecked((uint)myInt);
int asInt = unchecked((int)myUint);

Hedef türü körü körüne 32 biti seçecek ve yeniden yorumlayacaktır.

Tersine, ondalık / sayısal değerleri hedef türünün kendi aralığı içinde tutmakla daha fazla ilgileniyorsanız:

uint asUint = checked((uint)myInt);
int asInt = checked((int)myUint);

Bu durumda, aşağıdaki durumlarda taşma istisnaları alırsınız:

  • bir uint'e negatif int (örneğin: -1) çevirmek
  • bir int'e 2,147,483,648 ile 4,294,967,295 arasında pozitif bir uint yayınlamak

Bizim durumumuzda, uncheckedçözümün 32 biti olduğu gibi korumasını istedik, işte bazı örnekler:

Örnekler

int => uint

int....: 0000000000 (00-00-00-00)
asUint.: 0000000000 (00-00-00-00)
------------------------------
int....: 0000000001 (01-00-00-00)
asUint.: 0000000001 (01-00-00-00)
------------------------------
int....: -0000000001 (FF-FF-FF-FF)
asUint.: 4294967295 (FF-FF-FF-FF)
------------------------------
int....: 2147483647 (FF-FF-FF-7F)
asUint.: 2147483647 (FF-FF-FF-7F)
------------------------------
int....: -2147483648 (00-00-00-80)
asUint.: 2147483648 (00-00-00-80)

uint => int

uint...: 0000000000 (00-00-00-00)
asInt..: 0000000000 (00-00-00-00)
------------------------------
uint...: 0000000001 (01-00-00-00)
asInt..: 0000000001 (01-00-00-00)
------------------------------
uint...: 2147483647 (FF-FF-FF-7F)
asInt..: 2147483647 (FF-FF-FF-7F)
------------------------------
uint...: 4294967295 (FF-FF-FF-FF)
asInt..: -0000000001 (FF-FF-FF-FF)
------------------------------

Kod

int[] testInts = { 0, 1, -1, int.MaxValue, int.MinValue };
uint[] testUints = { uint.MinValue, 1, uint.MaxValue / 2, uint.MaxValue };

foreach (var Int in testInts)
{
    uint asUint = unchecked((uint)Int);
    Console.WriteLine("int....: {0:D10} ({1})", Int, BitConverter.ToString(BitConverter.GetBytes(Int)));
    Console.WriteLine("asUint.: {0:D10} ({1})", asUint, BitConverter.ToString(BitConverter.GetBytes(asUint)));
    Console.WriteLine(new string('-',30));
}
Console.WriteLine(new string('=', 30));
foreach (var Uint in testUints)
{
    int asInt = unchecked((int)Uint);
    Console.WriteLine("uint...: {0:D10} ({1})", Uint, BitConverter.ToString(BitConverter.GetBytes(Uint)));
    Console.WriteLine("asInt..: {0:D10} ({1})", asInt, BitConverter.ToString(BitConverter.GetBytes(asInt)));
    Console.WriteLine(new string('-', 30));
}  


0

Uint'in içerdiği değerin bir int içinde gösterilebileceğini varsayarsak, bu kadar basittir:

int val = (int) uval;


0

TryParse kullanarak şunu söyleyebilirim, uint bir int için büyükse 'false' döndürür.
Unutmayın, bir uint,> 0 olduğu sürece int'ten çok daha büyük olabilir.



-1
int intNumber = (int)uintNumber;

Ne tür değerler beklediğinize bağlı olarak, dönüşümü yapmadan önce uintNumber'ın ne kadar büyük olduğunu kontrol etmek isteyebilirsiniz. Bir int, bir uint'in yaklaşık 0,5'lik bir maksimum değerine sahiptir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.