Jakie są zalety Two's Complement?


11

W niektórych urządzeniach ADC / DAC są to opcje wysyłania / wprowadzania danych w formularzu Uzupełnienie 2.

Jakie są zalety reprezentowania danych cyfrowych w formularzu Two Two, gdy możesz mieć prosty kod binarny i zaoszczędzić czas na konwersji?


4
Komplement Two to prosty kod binarny ...
Mooing Duck

„Algebra jest uruchamiana na maszynie (wszechświecie), która jest dopełnieniem dwóch” - HAKMEM 154 ( inwap.com/pdp10/hbaker/hakmem/hacks.html )
ChrisInEdmonton

2
Co to jest 5 w uzupełnieniu do dwóch? 101. Co to jest 5 w prostym kodzie binarnym? 101. Co to jest -5 w uzupełnieniu do dwóch? 1 ... 11111011. Co to jest -5 w prostym kodzie binarnym? Uhh ...
user253751

Wydaje się, że rzadki przypadek specjalny ma ADC z ujemną mocą wyjściową? Co to znaczy, że zmierzone napięcie jest niższe niż niskie napięcie odniesienia? A jak zbudowałbyś taki ADC? Sukcesywne przybliżenie z czapkami, które mają obciążenie ujemne ...?
Lundin,

Zauważ, że istnieją dwa różne słowa: komplement i komplement . Temat jest komplementem dwóch , nawet jeśli te dwójki są bardzo grzeczne i często mówią o tobie miłe rzeczy.
Pete Becker

Odpowiedzi:


11

Reprezentatywna reprezentacja dwóch liczb całkowitych ze znakiem jest łatwa w obróbce sprzętowej. Na przykład negację (tj. X = -x ) można wykonać po prostu przez przerzucenie wszystkich bitów liczby i dodanie jednego. Wykonanie tej samej operacji w surowym pliku binarnym (np. Z bitem znaku) zwykle wymaga dużo więcej pracy, ponieważ niektóre bity w strumieniu należy traktować jako specjalne. To samo dotyczy dodawania - operacja dodawania dla liczb ujemnych jest identyczna z operacją dodawania dla liczb dodatnich, więc nie jest wymagana dodatkowa logika (bez zamierzonej gry słów) do obsługi wielkości ujemnej.

Chociaż nie oznacza to, że jest łatwiejsze z twojej perspektywy, jako konsument tych danych, zmniejsza wysiłek projektowy i złożoność urządzenia, a tym samym prawdopodobnie czyni go tańszym.


1
Przerzucanie bitów, a następnie dodawanie 1 w celu zanegowania, nie?
Scott Seidman

2
@ScottSeidman Tak, przepraszam, zapomniałem trochę. Edytowane, aby naprawić :)
Wielomian

1
W rzeczywistości, dla maksymalnej wrażliwości, w zależności od procesora, może być jednym cyklem, aby wziąć x = x * -1 lub x = 0 - x , w porównaniu z co najmniej dwoma cyklami dla x = ~ x + 1
markt

@markt Tak, ale jeśli implementujesz tylko minimalne urządzenie (tj. nie pełny procesor), warto zredukować złożoność krzemu do absolutnego minimum.
Wielomianowy

5
+1 Również uzupełnienie Two ma tylko jedną wartość 0. Inne (np. Uzupełnienie lub bit znaku) kończą dwa
sbell

5

ADC może konwertować dane (powiedzmy napięcia wejściowe od 0 do 5 V) i albo musisz je podpisać (0 V = 0, 5 V = maks. Kod), albo podpisać (2,5 V = 0, 0 V = maks. -Ve, 5 V = maks. + ve).

Oprócz uzupełnienia 2, które jest najczęstszą reprezentacją komputerową dla podpisanych danych, konwersja między dwoma opisanymi powyżej formatami jest całkowicie trywialna: wystarczy odwrócić MSB!

Jest to niezwykle tanie, aby dodać do wewnętrznej logiki ADC i daje ADC kolejny punkt sprzedaży w arkuszu danych ...


Właśnie dodałem przełącznik MSB między uzupełnieniem dwóch i przesuniętym plikiem binarnym jako komentarz poniżej
Scott Seidman

3

Jeśli potrzebujesz wykonać matematykę na reprezentacjach liczb ujemnych, uzupełnienie dwójki sprawia, że ​​jest to łatwiejsze niż przesunięcie binarne, które będzie pasować do typu danych „podpisane int”. Twój kompilator po prostu będzie wiedział, jak sobie z tym poradzić. W przeciwnym razie tykasz na zegar, konwertując tam iz powrotem.


1

W tym pytaniu wydaje się sugerować, że ADC potrzebuje więcej czasu na zwrócenie wartości w postaci uzupełnienia 2 niż w prostej formie binarnej. Chociaż może tak być w przypadku niektórych szczególnych implementacji ADC, ogólnie nie jest to prawdą (na przykład seria mikrokontrolerów MSP430 ma peryferyjny układ ADC, który zgłosi wartość w postaci binarnej prostej lub uzupełnienia 2, ale w obu przypadkach wykonuje tę samą liczbę cykli).

Z tego powodu wybór między uzupełnieniem 2 a prostym plikiem binarnym sprowadza się głównie do tego, jak działają twoje przetworniki i jak lubisz przetwarzać swoje dane.

W prostym trybie binarnym ADC podaje liczbę, która reprezentuje stosunek wielkości mierzonej wielkości analogowej (praktycznie zawsze napięcie) do wielkości odniesienia w pełnej skali. Na przykład 10-bitowy ADC może zwracać wartości od 0 do 1023 (włącznie). Jeśli zmierzysz napięcie (powiedzmy 1,25 wolta), które jest połową napięcia odniesienia ADC (powiedzmy 2,50 wolta), odczytany kod binarny będzie stanowił połowę maksymalnej wartości, którą możesz odczytać - czyli 512 lub więcej, podlega zaokrągleniu i nieliniowości w ADC.

Załóżmy na przykład, że masz przetwornik, który informuje o ilości paliwa rakietowego w zbiorniku. 0 V oznacza, że ​​zbiornik jest pusty, a 2,5 V oznacza, że ​​jest pełny. Wystarczy podłączyć przetwornik do ADC i gotowe!

Zauważ jednak, że w powyższym akapicie nie ma sposobu na zmierzenie ujemnych napięć. Co jeśli chcielibyśmy zmierzyć przepływ paliwa rakietowego do i ze zbiornika (i mieliśmy do tego przetwornik)? ADC nie może mierzyć liczb ujemnych, więc mamy problem. Istnieje jednak prosty sposób na sfałszowanie go za pomocą trybu komplementacji 2: W tym przypadku moc wyjściowa przetwornika jest ponownie nastawiana, tak że punkt zerowy znajduje się w połowie odległości między dwoma napięciami odniesienia ADC. Innymi słowy, dodatnie przepływy są reprezentowane przez napięcia między 1,25 V a 2,50 V, a ujemne przepływy reprezentowane są przez 1,25 V do 0 V - więc przepływy do zbiornika dadzą kody ADC od 512 do 1023, a przepływy z podziękowań dadzą kody od 511 do 0 (w prostym formacie binarnym).

To jest okropnie niewygodne. Musimy odjąć 512 od każdego pomiaru, zanim cokolwiek z nim zrobimy, co daje liczby w zakresie od -512 do +511. Istotą trybu dopełniania 2 jest to, że robi to za Ciebie!

Jednak nadal możesz chcieć używać prostego pliku binarnego z przetwornikiem, który generuje podpisane wyniki. Na przykład twój przetwornik może mieć wyjścia różnicowe: W tym przypadku i tak chciałbyś odjąć wyjście odwrócone od wyjścia nieodwróconego, więc nie ma żadnej korzyści z używania uzupełnienia 2.


1

System uzupełniania dwóch jest w użyciu, ponieważ wynika z tego, jak prosty sprzęt działa w naturalny sposób. Pomyśl na przykład o liczniku kilometrów samochodu, który zresetowałeś do zera. Następnie włącz bieg wsteczny i jedź do tyłu o 1 milę (w rzeczywistości nie rób tego). Twój licznik przebiegu (jeśli jest mechaniczny) będzie toczył się od 0000 do 9999. Układ dopełniania dwóch zachowuje się podobnie.

wprowadź opis zdjęcia tutaj


Pamiętaj, że tak naprawdę nie oferuję tutaj żadnych nowych informacji, tylko przykład licznika przebiegu, który może być dla kogoś pomocny - pomógł mi zrozumieć uzasadnienie układu dopełniacza dwóch osób, gdy byłem młody. Potem łatwo było mi intuicyjnie zaakceptować, że sumatory, odejmatory itp. Działają dobrze z systemem uzupełniania tych dwóch.

I tak, licznik kilometrów mojego Nissana działa w ten sposób.


Twoja odpowiedź dotyczy przepełnienia (i niedopełnienia), ale ponieważ licznik kilometrów nie wyświetla liczb ujemnych, nie odnosi się do niczego związanego z dopełnianiem dwóch ...
marcelm

@marcelm Właściwie przykład drogomierz robi wyjaśnić kod uzupełnień do dwóch. Po prostu PkP nie poszedł wystarczająco daleko z wyjaśnieniem. Jeśli sześciocyfrowy licznik odczyta zero, a ty jedziesz do tyłu przez jedną milę, to spodziewałbyś się, że wyświetli -1. Zamiast tego odczytuje 999999. To dlatego, że 999999 jest sześciocyfrową, dziesiątkową komplementarną reprezentacją -1.
Solomon Slow

@jameslarge Nie, nadal nie ma. W odpowiedzi nie ma nic, co by dotykało dopełnienia dwóch. Lub uzupełnienie, wielkość znaku lub dowolna reprezentacja liczby ze znakiem.
marcelm

@marcelm Tak, istnieje: bardzo podstawowa idea systemu uzupełniania dwóch: to zero minus jeden równa się maksymalnej reprezentowanej liczbie całkowitej bez znaku. Taka jest idea systemu uzupełniania dwóch. Żadna inna reprezentacja podpisanego numeru nie oferuje tego (o ile mi wiadomo). Przykład licznika przebiegu pokazuje, jak naturalnie ta właściwość behawioralna pochodzi z prostoty inżynierii; w przypadku drogomierza: z budowy maszyn. Zarówno w świecie mechanicznym, jak i elektronicznym, to (system dwóch uzupełnień) jest najprostszym sposobem, aby działał.
PkP

0

Inni już odpowiedzieli, dlaczego dwójka komplementów binarnych jest wygodna dla sprzętu komputerowego. Wydaje się jednak, że pytasz, dlaczego A / D wyprowadziłby komplement dwójki zamiast „prosto binarnego” (cokolwiek, co tak naprawdę myślisz).

Większość A / D generuje prostą, niepodpisaną wartość binarną w zakresie od 0 do 2 N -1, gdzie N jest liczbą bitów, na które A / D konwertuje. Zauważ, że można to również uznać za dopełnienie notacji podwójnej, tylko że wartości nigdy nie są ujemne. Jeśli masz do czynienia tylko z liczbami dodatnimi, większość reprezentacji binarnych jest taka sama. Obejmuje to komplement dwójki i wielkość znaku.

Niektóre A / D, szczególnie te wbudowane w mikrokontrolery, mają opcję wytwarzania wartości ujemnych dla dolnej połowy zakresu. Może to być zauważalną zaletą przy pomiarze sygnału bipolarnego.

Przynajmniej w mikrokontrolerze jest to na ogół głupie. W niektórych przypadkach możesz użyć wartości A / D bezpośrednio bez jakiejkolwiek konwersji. W takim przypadku wszystkie inne wartości zostały już przekonwertowane na zakres A / D. Ograniczenie tego do wszystkich liczb nieujemnych faktycznie upraszcza rzeczy.

W przeciwnym razie zamierzasz zastosować skalowanie i przesunięcie do odczytów A / D, aby wprowadzić je do jednostek, których używasz do wartości wewnętrznie. Tutaj znowu nie ma minusów dla niepodpisanych wartości pochodzących bezpośrednio z A / D. W rzeczywistości zwykle stosuję trochę filtrowania dolnoprzepustowego dla wartości surowych przed jakimkolwiek skalowaniem i przesunięciem. Znajomość tych wartości nigdy nie będzie ujemna, co nieco upraszcza obliczenia. Wykonanie skalowania dla niepodpisanych wartości sprawia, że ​​czasem jest to trochę prostsze.

Nie pamiętam ani jednego przypadku w ponad 100 projektach z mikrokontrolerem, w których użyłem A / D w dowolnym formacie wyjścia bez znaku.

Aby odpowiedzieć na pytanie, jakie są zalety wyjścia A / D „komplement dwójki”, istnieją dwie odpowiedzi:

  1. Wszystkie robią tak czy inaczej, tyle że przez większość czasu wartości te są nieujemne, więc nie można odróżnić komplementu dwójki od innych oznaczeń, takich jak wielkość znaku.

  2. Korzyści są bardzo niewielkie. Wewnątrz mikrokontrolera zasadniczo nie istnieją.

    W dedykowanym sprzęcie może być pewna zaleta posiadania ujemnych wartości wskazujących ujemne napięcie wejściowe, w którym to przypadku komplement dwóch jest najprostszym sposobem radzenia sobie z zakresem wartości. Należy zauważyć, że jeśli zakres napięcia wejściowego nie jest symetryczny w stosunku do 0, wówczas ta przewaga zanika.


-1

O czym jest ten „prosty kod binarny”? Zakładam, że masz na myśli bit znaku, który ma wartość „1” dla wartości ujemnej i „0” dla wartości dodatniej (lub odwrotnie ). Ma to jeszcze dwie wady w stosunku do dwóch uzupełnień, o których jeszcze nie wspomniano: jedna w dużej mierze obecnie nieistotna i jedna ważna.

W dużej mierze nieistotna jest to, że możesz reprezentować jedną mniejszą liczbę - tj. 255 liczb w 8 bitach. Jest to dość nieistotne, gdy masz 32 lub 64 bity, ale miało to znaczenie, gdy miałeś tylko 4 lub 6 bitów do pracy.

Ważniejsze jest to, że istnieją teraz dwa sposoby reprezentowania tej samej liczby - konkretnie 0 - +0 i -0, ale +0 i -0 są tym samym numerem, więc twoja implementacja musi upewnić się, że nie porównujesz ich liczby za każdym razem, gdy przeprowadzasz kontrolę równości.


Myślę, że nie masz tutaj racji. Mówisz o reprezentacji wielkości znaku, kiedy OP dość wyraźnie mówił o niepodpisanej reprezentacji binarnej.
Joe Hass

1
Jeśli mówisz o niepodpisanej reprezentacji, to uzupełnienie Two nie ma żadnej przewagi. To po prostu trochę marnuje.
Jack Aidley
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.