2012-02-08 23 views
15

unsigned int taşırken ne içerir? Spesifik olmak gerekirse, iki unsigned int s ile bir çarpım yapmak istiyorum: çarpma bittikten sonra unsigned int ne olacak?İmzasız İnterkanın Taşılması

unsigned int someint = 253473829*13482018273; 
+0

Bu, http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-c-c dosyasının bir kopyası gibi görünüyor. –

+1

Neden denemiyorsunuz ve ne aldığınızı görüyor musunuz? Genel olarak, imzasız bir int taşarsa, sıfıra yuvarlanır. Böylece UINT_MAX + 5 'toplanır ve 4 olur. –

+0

Maksimum uint değeri ile taşma değerinin ne olacağı değeri arasındaki fark bu olur. Basit yapalım. Maksimum 5'inin 5 olduğunu söyleyelim. 2 * 4 eklemek istiyoruz. Böylece bu, 8 yerine son 3 değerini veriyor. –

cevap

22

unsigned numaraları taşması, ancak bunun yerine modulo özelliklerini kullanarak etrafına sarmak olamaz. Örneğin, unsigned int, 32 bit olduğunda, sonuç şu olur: (a * b) mod 2^32: .


CharlesBailey belirttiği gibi, 253473829*13482018273 dönüştürülmeden önce imzalanan çarpma kullanabilir ve böylece çarpma öncesinde unsigned konusunda açık olmalıdır:

unsigned int someint = 253473829U * 13482018273U; 
+0

bir standardın bir parçası mı? –

+2

@Zhenya Evet, hem C hem de C++. – Pubby

+0

@Zhenya - Fark eder mi? Cevap% 100 doğrudur. Onun UINT_MAX + 5 diyerek daha teknik bir yolu 4'tür. Bu muhtemelen hem .NET dillerinde hem de Java'da geçerli kalacaktır. En azından .NET NaN durumunda, değerin (çoğu zaman) tam olarak gösterilmediği çift gibi tiplerle sınırlıdır. –

5

İmzasız tamsayı taşması, onun imzalı muadili sergiler aksine iyi tanımlanmış davranış.

Değerler temel olarak "sarılır". Güvenli ve yaygın olarak sayma veya karma mod/mod işlevleri için kullanılır.

+3

İşaretsiz değil taşma –

+1

Ben benzer bir şey ile ilgili açıklayarak bunu denemek için bir karşılaştırma olarak demek istedim. Daha sonra ifademi bitirdim. Ah teknikler. – evandrix

-3

Muhtemelen derleyicinize biraz bağlı. Bu yıllar önce hatalar yaptım ve bazen çalışma zamanı hatası alacaksınız, diğer zamanlarda temel olarak, en yüksek seviyedeki bitleri kesmekten ve geri kalanını bırakmadan kaynaklanan çok küçük bir sayıya geri "sarılacak", yani eğer 32 bit unsigned int ve çarpımın sonucu 34 bitlik bir sayı olur, yüksek sipariş 2 bit doğrayın ve geri kalanını verir. Muhtemelen aldığınızı tam olarak görebilmek için derleyicinizde denemeniz gerekir. Bu, farklı bir derleyicide alacağınız şeyle aynı olmayabilir, özellikle de taşma sonucu, sonuçtaki sonucun içinde olduğu bir ifadenin ortasında gerçekleşiyorsa imzasız bir int aralığı.

+0

** İmzasız ** taşması derleyiciye bağlı değildir, etrafa sarılı semantik olması için standartlaştırılmıştır. Tanımlanmamış değerlere yol açan sadece ** işaretli ** taşmadır ve bu nedenle derleyiciye bağlı olabilir. – cmaster

İlgili konular