Najlepsza odpowiedź
Na początku musimy podkreślić te punkty:
-
ALU
nie obchodzi, czy robisz matematykę ze znakiem, czy bez. -
ALU
robi tylko binarne matematyka i odpowiednio ustawia flagi. - W
signed numbers
bit znaku to bit, który wskazuje znak liczby. i znajduje się w najbardziej znaczącym bicie.
– W bez znaku , musimy obserwować flagę przeniesienia, aby wykryć błędy.
– W ze znakiem arytmetyczne, musimy obserwować flagę przepełnienia, aby wykryć błędy.
– Flaga przenoszenia jest ustawiona, jeśli:
- dodanie dwóch liczb powoduje wykonanie najbardziej znaczących (skrajnych lewych) bitów adde d.
-
1111 + 0001 = 0000
=> flaga przeniesienia jest włączona. - odejmowanie dwóch liczb wymaga pożyczenia do najbardziej znaczącej (skrajnej lewej ) bity odjęte.
-
0000 - 0001 = 1111
=> flaga przeniesienia jest włączona.
– Flaga przepełnienia jest ustawiana, jeśli:
- suma dwóch liczb z bitem znaku
off
daje wynik numer ze znakiem bituon
. -
0100 + 0100 = 1000
=> flaga przepełnienia jest włączona. - suma dwóch liczb z bitem znaku
on
daje wynikową liczbę z bitem znakuoff
. -
1000 + 1000 = 0000
=> flaga przepełnienia jest włączona. - Zwróć uwagę, że : znak mieszany dodawanie nigdy nie włącza flagi przepełnienia.
– aby było jaśniej, zobaczmy te 2 przykłady:
1 – załóżmy następujący dodatek binarny `0111 + 0010 = 1001 `
– jeśli zajmujemy się matematyką bez znaku
0111 + 0010 = 1001 // overflow flag is turned on.
7 + 2 = 9 // its ok, we only care about the carry flag
– jeśli robimy matematykę ze znakiem
0111 + 0010 = 1001 // overflow flag is turned on.
7 + 2 = -7 // error detected
2 – załóżmy następujące dodanie binarne `1111 + 0001 = 0000`
– jeśli robimy matematykę bez znaku
1111 + 0001 = 0000 // carry flag is turned on.
15 + 1 = 0 // error detected
– jeśli robimy matematykę ze znakiem
1111 + 0001 = 0000 // carry flag is turned on.
-1 + 1 = 0 // its ok we only care about the overflow flag
// remember: Mixed-sign addition never turns on the overflow flag.
wreszcie więcej informacji można znaleźć tutaj: http://teaching.idallen.com/dat2343/10f/notes/040\_overflow.txt
Odpowiedź
Z mechanistycznego punktu widzenia, flaga przeniesienia jest ustawiana, gdy następuje wykonanie najbardziej znaczącego bitu. Flaga przepełnienia jest ustawiana, gdy istnieje przeniesienie do najbardziej znaczącego bitu.
W przypadku arytmetyki bez znaku musisz się tylko martwić o przeniesienie flaga. Jeśli coś jest wykonywane z najbardziej znaczącego bitu, to wynik jest zbyt duży, aby można go było zawrzeć w jednym rejestrze.
W przypadku arytmetyki ze znakiem sytuacja jest bardziej złożona. Przepełnienie występuje, gdy flaga przeniesienia i flaga przepełnienia są różne. Oto wszystkie alternatywy dla dodawania na dwóch bitach.
00 + 00 = 00, (0 + 0 = 0 decimal), CF = 0, OF = 0
01 + 01 = 10, (1 + 1 = -2 decimal) CF = 0, OF = 1 overflow
01 + 10 = 11, ( 1 + -2 = -1 decimal), CF = 0, OF = 0
01 + 11 = 00, ( 1 + -1 = 0 decimal), CF = 1, OF = 1
10 + 10 = 00, ( -2 + -2 = 0 decimal), CF = 1, OF = 0 overflow
10 + 11 = 01, ( -2 + -1 = 1 decimal), CF = 1, OF = 0 overflow
11 + 11 = 10, (-1 + -1 = -2 decimal), CF = 1, OF = 1
Zwróć uwagę, że wiersze 2, 5 i 6 dają nieprawidłowe wyniki z powodu przepełnienia i że są one również wtedy, gdy CF różni się od OF.
Niektóre procesory mogą robić to porównanie dla Ciebie, a OF, który widzisz, może być wynik porównania wewnętrznej flagi przeniesienia z flagą przeniesienia (usunięcia). Nadal będzie działać tylko dla arytmetyki ze znakiem.
Działa również z innymi arytmetykami, w tym z mnożeniem.