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?
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?
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).
Skąd wiadomo, że to robi? – lindelof
"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