2012-06-08 17 views
11

İki tam sayı olduğunu varsayalım (int x, y;).
x, negatif ve y = 0x80000000'dir.Taşma olmadan çıkarma?

x + (-y), (x - y) neden taşmıyor?
Bilgisayar ekleyerek çıkarma yapmıyor mu?

+0

Bunu nasıl yaptığını biliyor musunuz? – lindelof

+0

"Bilgisayar Sistemleri, Bir Programcının Perspektifi" Problemi Çözüm 2.32 (sayfa 87) "... biz de TMi'ye eşit olacak, ve böylece işlevimiz vard_ok, negatif her zaman negatif taşma olacağını düşünecektir. Aslında, bu durumlar için xy taşmaz ... " – Yuu

cevap

8

İlk sorunuzu yanıtlamak için, 0x80000000 (-2,147,483,648) imzalı tamsayılar için en az 32 bit değeri temsil eder. 2,147,483,647 maksimum değerdir. Maksimum değerin büyüklüğü, Two's Complement kullanılarak saklandığında minimum değerin büyüklüğünden daha azdır. (-y)'un tek başına alınması maksimum değeri (1'e kadar) geçtiği için temsil edilemez. (x-y)'un son tamsayı değeri, aralıktadır (x'un negatif olduğu göz önüne alınır) ve 32 bitlik bir tam sayı ile temsil edilebilir.

İkinci sorunuzu cevaplamak için, çıkarılacak olan sayıyı ek olarak tersine dönüştürerek çıkarma işlemi gerçekleştirilir. Bu durumda taşma potansiyeli düşünüldüğünde, derleyiciniz için -((-x)+y) yaparak doğru sonucu alabilir. Ancak, bu saf spekülasyon (bunu güvenli bir şekilde yapmak için düşünebildiğim tek yol).