2012-06-08 12 views
11

Załóżmy, że istnieją dwie liczby całkowite (int x, y;).
x jest negatywna i y = 0x80000000.Odejmowanie bez przepełnienia?

Dlaczego (x - y) nie przepełnia się, gdy x + (-y) ma?
Czy komputer nie odejmuje przez dodanie?

+0

Skąd wiadomo, że to robi? – lindelof

+0

"Systemy komputerowe, perspektywa programisty" Rozwiązanie problemu 2.32 (strona 87) "... będziemy mieli -y również równe TMin, więc funkcja tadd_ok będzie uważać, że wystąpi ujemny przepełnienie w dowolnym czasie x jest ujemne. Fakt, xy nie przepełnia tych przypadków ... " – Yuu

Odpowiedz

8

Aby odpowiedzieć na twoje pierwsze pytanie, 0x80000000 (-2,147,483,648) reprezentuje minimum 32-bitową wartość dla liczb całkowitych ze znakiem. 2 147 483 647 jest wartością maksymalną. Wartość maksymalnej wartości jest mniejsza niż wartość minimalna, jeśli jest przechowywana przy użyciu Two's Complement. Samo pobieranie (-y) nie może być reprezentowane, ponieważ przekracza wartość maksymalną (o 1). Końcowa wartość całkowita (x-y) jest w zakresie (biorąc pod uwagę, że x jest ujemna) i może być reprezentowana przez 32-bitową liczbę całkowitą.

Aby odpowiedzieć na drugie pytanie, odejmowanie uzyskuje się przez zamianę liczby, która ma zostać odjęta, na jej odwrotność. Biorąc pod uwagę możliwość przepełnienia w tej sytuacji, Twój kompilator może uzyskać poprawny wynik dla (x-y), wykonując -((-x)+y). Jest to jednak czysta spekulacja (jest to jedyny sposób, w jaki mogę to zrobić bezpiecznie).