Jaka jest różnica we flagach przeniesienia i przepełnienia podczas mnożenia binarnego?


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 bitu on.
  • 0100 + 0100 = 1000 => flaga przepełnienia jest włączona.
  • suma dwóch liczb z bitem znaku on daje wynikową liczbę z bitem znaku off.
  • 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *