Co to jest "dopełnienie 2"?

Jestem na kursie systemów komputerowych i miałem zmagania , częściowo, z dwójką . Chcę to zrozumieć, ale wszystko, co przeczytałem, nie przyniosło mi tego obrazu. Przeczytałem artykuł Wikipedii i wiele innych artykułów, w tym mój podręcznik .

Dlatego chciałem rozpocząć ten community wiki post, aby określić, co to jest dopełnienie dwójki, jak go używać i jak może wpływać na liczby podczas operacje takie jak odlewy(od podpisanych do niepodpisanych i odwrotnie), operacje bitowe i operacje bitowe.

Liczę na jasną i zwięzłą definicję , łatwo zrozumiałą dla programisty.

Author: Frank V, 2009-06-26

23 answers

Dopełniacz Two jest sprytnym sposobem przechowywania liczb całkowitych, tak aby typowe problemy matematyczne były bardzo proste do wdrożenia.

Aby zrozumieć, musisz myśleć o liczbach binarnych.

To w zasadzie mówi,

  • dla zera, użyj wszystkich 0.
  • dla dodatnich liczb całkowitych, zacznij liczyć maksymalnie 2 (Liczba bitów - 1)-1.
  • dla liczb całkowitych ujemnych, zrób dokładnie to samo, ale zmień rolę 0 i 1 (więc zamiast począwszy od 0000, zacznij od 1111 - to część "dopełniacza").

Spróbujmy z mini-bajtem 4 bitów(nazwijmy go nibble - 1/2 bajtu).

  • 0000 - zero
  • 0001 - jeden
  • 0010 - dwa
  • 0011 - trzy
  • 0100 do 0111 - od czterech do siedmiu

Tylko tyle możemy osiągnąć w pozytywach. 23-1 = 7.

Dla negatywów:

  • 1111 - ujemny one
  • 1110 - dwa ujemne
  • 1101 - negatywna trójka
  • 1100 do 1000 - minus cztery do minus osiem

Zauważ, że otrzymujesz jedną dodatkową wartość dla negatywów (1000 = -8), której nie masz dla pozytywów. Dzieje się tak dlatego, że 0000 jest używane dla zera. Można to uznać za linię liczb komputerów.

Rozróżnianie liczb dodatnich i ujemnych

Robiąc to, pierwszy bit dostaje rolę " znaku" bit, ponieważ może być używany do rozróżniania nieujemnych i ujemnych wartości dziesiętnych. Jeśli najbardziej znaczącym bitem jest 1, to binarny może być uznany za ujemny, gdzie tak, jakby najbardziej znaczącym bitem (lewym) jest 0, można powiedzieć, że wartość dziesiętna jest nonnegatywna.

"Sign-magnitude" liczby ujemne mają po prostu odwrócony bit znaku ich dodatnich odpowiedników, ale takie podejście musi radzić sobie z interpretacją 1000 (jeden 1, a następnie wszystkie 0 s) jako "ujemne zero", co jest mylące.

"dopełnienie jedynek" liczby ujemne są tylko dopełnieniem bitowym ich dodatnich odpowiedników, co prowadzi również do mylącego "zera ujemnego" z 1111 (Wszystkie jedynki).

Prawdopodobnie nie będziesz musiał zajmować się reprezentacjami dopełniacza lub liczby całkowitej, chyba że pracujesz bardzo blisko sprzętu.

 651
Author: lavinio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-23 03:11:11

Zastanawiam się, czy można to wyjaśnić lepiej niż w artykule na Wikipedii.

Podstawowy problem, który próbujesz rozwiązać za pomocą reprezentacji dopełniacza two, to problem przechowywania ujemnych liczb całkowitych.

Najpierw rozważmy niepodpisaną liczbę całkowitą przechowywaną w 4 bitach. Możesz mieć następujące

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Są niepodpisane, ponieważ nie ma wskazań, czy są negatywne czy pozytywne.

Wielkość znaku i nadmiarowa notacja

Do przechowywania negatywów numery możesz spróbować wielu rzeczy. Po pierwsze, można użyć notacji wielkości znaku, która przypisuje pierwszy bit jako bit znaku do reprezentowania+/ -, a pozostałe bity do reprezentowania wielkości. Więc używając ponownie 4 bitów i zakładając, że 1 oznacza-i 0 oznacza + wtedy masz

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7
Widzisz w tym problem? Mamy dodatnie i ujemne 0. Większym problemem jest dodawanie i odejmowanie liczb binarnych. Obwody dodawania i odejmowania za pomocą wielkości znaku będą bardzo złożone.

Co to jest

0010
1001 +
----

?

Innym systemem jest nadmiarowa notacja . Możesz przechowywać liczby ujemne, pozbyć się problemu dwóch zer, ale dodawanie i odejmowanie pozostaje trudne.

/ Align = "left" / Teraz możesz przechowywać dodatnie i ujemne liczby całkowite i wykonywać arytmetykę ze względną łatwością. Istnieje wiele metod przekształcania liczby w dopełniacz dwójki. Tu jest jeden.

Convert Decimal to Two ' S Dopełniacz

  1. Konwertuj liczbę na binarną (na razie ignoruj znak) np. 5 to 0101 i -5 to 0101

  2. Jeśli liczba jest liczbą dodatnią, to gotowe. np. 5 to 0101 w zapisie binarnym z dopełniaczem dwójkowym.

  3. Jeśli liczba jest ujemna to

    3.1 znajdź dopełniacz (Odwróć 0 i 1) np. -5 jest 0101 więc znalezienie dopełniacza to 1010

    3.2 dodać 1 do dopełniacza 1010 + 1 = 1011. Dlatego -5 w dwóch dopełnieniem jest 1011.

Więc, co jeśli chcesz zrobić 2 + (-3) w binarnym? 2 + (-3) to -1. Co musisz zrobić, jeśli używasz wielkości znaku, aby dodać te liczby? 0010 + 1101 = ?

Używając dopełnienia dwójki zastanów się, jak łatwo byłoby to zrobić.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

Konwersja dopełniacza dwójki na dziesiętny

Przeliczenie 1111 na dziesiętne:

  1. Liczba zaczyna się na 1, więc jest ujemna, więc znajdujemy dopełniacz 1111, który jest 0000.

  2. Dodaj 1 do 0000, a otrzymamy 0001.

  3. Konwertuj 0001 na dziesiętne, czyli 1.

  4. Zastosuj znak = -1.

Tada!
 358
Author: Vincent Ramdhanie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-02 17:08:26

Jak większość wyjaśnień, które widziałem, te powyżej są jasne, jak pracować z dopełnieniem 2, ale tak naprawdę nie wyjaśniają, czym są matematycznie. Postaram się to zrobić, przynajmniej dla liczb całkowitych, i najpierw przedstawię jakieś tło, które prawdopodobnie jest znajome.

Przypomnij jak to działa dla dziesiętnych:
2345
jest sposobem pisania
2 × 103 + 3 × 102 + 4 × 101 + 5 × 100.

W ten sam sposób binarny jest sposobem zapisu liczb za pomocą 0 oraz 1 zgodnie z tą samą ogólną ideą, ale zastąpienie tych 10s powyżej 2s. następnie w binarnym,
1111
jest sposobem pisania
1 × 23 + 1 × 22 + 1 × 21 + 1 × 20
a jeśli to rozwiążesz, to okaże się równe 15 (baza 10). To dlatego, że jest
8+4+2+1 = 15.

To wszystko jest dobre i dobre dla liczb dodatnich. Działa nawet dla liczb ujemnych, jeśli chcesz po prostu trzymać znak minus przed nimi, jak ludzie robią z liczbami dziesiętnymi. To można nawet zrobić w komputerach, tak jakby, ale nie widziałem takiego komputera od początku lat 70-tych. zostawię powody do innej dyskusji.

Dla komputerów bardziej efektywne okazuje się użycie reprezentacji dopełniacza dla liczb ujemnych. A oto coś, co często jest pomijane. Notacje dopełniacza obejmują pewnego rodzaju odwrócenie cyfr liczby, nawet implikowanych zer, które pojawiają się przed normalną liczbą dodatnią. To niezręczne, bo pojawia się pytanie: wszyscy? To może być nieskończona liczba cyfr do rozważenia.

Na szczęście komputery nie reprezentują nieskończoności. Liczby są ograniczone do określonej długości (lub szerokości, jeśli wolisz). Wróćmy więc do dodatnich liczb binarnych, ale z szczególny rozmiar. Użyję 8 cyfr ("bity") dla tych przykładów. Więc nasz numer binarny byłby naprawdę
00001111
lub
0 × 27 + 0 × 26 + 0 × 25 + 0 × 24 + 1 × 23 + 1 × 22 + 1 × 21 + 1 × 20

Aby utworzyć ujemne dopełnienie 2, najpierw uzupełniamy wszystkie (binarne) cyfry, tworząc
11110000
i dodaj 1 do formularza
11110001
ale jak mamy rozumieć, że oznacza to -15?

Odpowiedź jest taka, że zmieniamy znaczenie bitu wysokiego rzędu(tego po lewej). Ten kawałek będzie 1 dla wszystkich liczb ujemnych. Zmiana będzie polegała na zmianie znaku jego udziału w wartości liczby, w której się pojawia. Więc teraz nasze 11110001 rozumie się, że reprezentuje
-1 × 27 + 1 × 26 + 1 × 25 + 1 × 24 + 0 × 23 + 0 × 22 + 0 × 21 + 1 × 20
zauważ, że " - " przed tym wyrażeniem? Oznacza to, że znak bit niesie ciężar -27, to jest -128 (baza 10). Wszystkie pozostałe pozycje zachowują taką samą wagę, jaką miały w niepodpisanych liczbach binarnych.

Wypracowanie naszego -15, jest
-128 + 64 + 32 + 16 + 1
przymierz Twój kalkulator. -15.

Z trzech głównych sposobów, w jakie widziałem liczby ujemne reprezentowane w komputerach, dopełnienie 2 wygrywa dla wygody w ogólnym użyciu. Ale to jest dziwne. Ponieważ jest binarny, musi istnieć parzysta liczba możliwych kombinacji bitów. Każda liczba dodatnia może być sparowana z ujemną, ale jest tylko jedno zero. Negacja zera daje Ci zero. Więc jest jeszcze jedna kombinacja, numer z 1 w znaku bit i 0 wszędzie indziej. Odpowiednia liczba dodatnia nie mieściłaby się w liczbie używanych bitów.

Co jest jeszcze bardziej dziwne w tej liczbie jest to, że jeśli spróbujesz utworzyć jej dodatnią poprzez uzupełnienie i dodanie jednego, otrzymasz tę samą liczbę ujemną z powrotem. Wydaje się naturalne, że zero to zrobi, ale jest to nieoczekiwane i wcale nie jest to zachowanie, do którego jesteśmy przyzwyczajeni, ponieważ komputery pomijając, ogólnie myślimy o nieograniczonej podaży cyfr, a nie o stałej długości arytmetyka.

To jest jak wierzchołek góry lodowej dziwności. Więcej czeka pod powierzchnią, ale to wystarczy na tę dyskusję. Prawdopodobnie możesz znaleźć więcej, jeśli badasz "przepełnienie" dla arytmetyki punktów stałych. Jeśli naprawdę chcesz się do niego dostać, Możesz również zbadać "arytmetykę modułową".

 127
Author: ForDummies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-11 19:03:53

Dopełnienie

2 jest bardzo przydatne do znalezienia wartości binarnej, jednak pomyślałem o znacznie bardziej zwięzłym sposobie rozwiązania takiego problemu (nigdy nie widziałem, aby ktoś inny go opublikował):

Weźmy binarną, na przykład: 1101, która jest [zakładając, że przestrzeń "1" jest znakiem] równa -3.

Używając dopełnienia 2 możemy to zrobić...Odwróć 1101 do 0010...dodaj 0001 + 0010 = = = > daje nam 0011. 0011 w dodatniej wartości binarnej = 3. dlatego 1101 = -3!

Co Ja zrealizowane:

Zamiast wszystkich przerzucania i dodawania, można po prostu zrobić podstawową metodą rozwiązywania dla dodatniego binarnego (powiedzmy 0101) jest (23 * 0) + (22 * 1) + (21 * 0) + (20 * 1) = 5.

Zrób dokładnie tę samą koncepcję z negatywem!

Weźmy na przykład 1101:

Dla pierwszej liczby zamiast 23 * 1 = 8 , do -(23 * 1) = -8.

Następnie kontynuuj jak zwykle, robiąc -8 + (22 * 1) + (21 * 0) + (20 * 1) = -3

 20
Author: Simon Yundov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-22 19:47:26

Wyobraź sobie, że masz skończoną liczbę bitów/trytów / cyfr / cokolwiek. Definiujesz 0 jako wszystkie cyfry równe 0 i liczysz w górę naturalnie:

00
01
02
..

W końcu się przepełni.

98
99
00

Mamy dwie cyfry i możemy reprezentować wszystkie liczby od 0 do 100. Wszystkie te liczby są pozytywne! Załóżmy, że chcemy też reprezentować liczby ujemne?

Tak naprawdę mamy cykl. Liczba przed 2 to 1. Liczba przed 1 to 0. Liczba przed 0 jest... 99. Dla uproszczenia powiedzmy, że każda liczba powyżej 50 jest ujemna. "0 " do" 49 " oznacza 0 do 49. "99" to -1, " 98 " to -2, ... "50" to -50.

Reprezentacja ta jest dopełnieniem dziesięciu. Komputery zazwyczaj używają dopełniacza two , który jest taki sam, z wyjątkiem używania bitów zamiast cyfr.

Fajną rzeczą w dopełnieniu ten jest to, że dopełnienie po prostu działa. Nie trzeba robić nic specjalnego, aby dodać pozytywne i liczby ujemne!

 15
Author: Captain Segfault,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-26 19:04:18

Czytałem fantastyczne Wyjaśnienie na Reddicie przez jng, używając licznika kilometrów jako analogii.

Tutaj wpisz opis obrazka

Jest to użyteczna konwencja. Te same obwody i operacje logiczne, które dodawanie / odejmowanie liczb dodatnich w binarnych nadal działa na obu dodatnich i liczb ujemnych, jeśli używa się konwencji, dlatego jest tak użyteczne i wszechobecne.

Wyobraź sobie licznik przebiegu samochodu, kręci się po (powiedzmy) 99999. Jeśli przyrost 00000 otrzymujesz 00001. Jeśli zmniejszysz 00000, otrzymasz 99999 (ze względu na przewrócenie). Jeśli dodasz jeden z powrotem do 99999 to wraca do 00000. Warto więc zdecydować, że 99999 oznacza -1. Podobnie bardzo przydatne jest stwierdzenie, że 99998 oznacza -2 i tak dalej. Masz aby się gdzieś zatrzymać, a także zgodnie z konwencją, górna połowa liczb są uważane za ujemne (50000-99999), a dolna połowa dodatnia po prostu stać dla siebie (00000-49999). W rezultacie górna cyfra bycie 5-9 oznacza reprezentowana liczba jest ujemna i wynosi 0-4 oznacza, że reprezentowany bit jest dodatni - dokładnie taki sam jak bit górny reprezentujący znak w liczbie binarnej dopełniacza dwójki.

Zrozumienie tego też było dla mnie trudne. Raz dostałem i wróciłem do przeczytaj ponownie artykuły i wyjaśnienia książek (nie było internetu wtedy), okazało się, że wielu opisujących to nie zrozum to. Napisałem książkę uczącą języka assembly po to (co sprzedało całkiem dobrze jak na 10 lat).

 12
Author: Alister,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 16:01:50

Dwa dopełniacze można znaleźć dodając jeden do pierwszego dopełniacza danej liczby. Powiedzmy, że musimy znaleźć dopełnienie dwójkowe 10101, a następnie znaleźć jego dopełnienie jedynkowe, to jest 01010 dodać 1 do tego wyniku, to jest 01010+1=01011, co jest ostateczną odpowiedzią.

 5
Author: evaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-04 00:38:00

Pozwala uzyskać odpowiedź 10 – 12 w postaci binarnej za pomocą 8 bitów: To, co naprawdę zrobimy, to 10 +(-12)

Musimy uzyskać część komplement z 12, aby odjąć ją od 10. 12 w układzie binarnym to 00001100. 10 w układzie binarnym to 00001010.

Aby otrzymać komplement z 12, po prostu odwracamy wszystkie bity, a następnie dodajemy 1. 12 w binarnym odwróconym to 11110011. Jest to również kod Odwrotny (dopełniacz). Teraz musimy dodać jeden, który jest teraz 11110100.

Więc 11110100 jest komplementem 12! Łatwo, jeśli tak o tym myślisz.

Teraz możesz rozwiązać powyższe pytanie 10 - 12 w postaci binarnej.

00001010
11110100
-----------------
11111110  
 4
Author: NightSky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-28 19:30:52

2 'S Complements: kiedy dodamy dodatkowy jeden z 1' s complements liczby otrzymamy 2 ' S complements. Na przykład: 100101 to dopełniacz 1 to 011010, a dopełniacz 2 to 011010+1 = 011011 (dodając jeden z dopełniaczem 1) Aby uzyskać więcej informacji ten artykuł wyjaśnia to graficznie.

 3
Author: Milon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-26 09:29:03

Patrząc na system dopełnień z matematycznego punktu widzenia, to naprawdę ma sens. W dopełnieniu ten chodzi o to, aby zasadniczo "wyizolować" różnicę.

Przykład: 63 - 24 = x

Dodajemy dopełnienie 24, które jest tak naprawdę tylko (100 - 24). Więc tak naprawdę, wszystko co robimy, to dodawanie 100 po obu stronach równania.

Teraz równanie brzmi: 100 + 63 - 24 = x + 100, dlatego usuwamy 100 (lub 10 lub 1000 lub cokolwiek innego).

Ze względu na niewygodne sytuacja konieczności odjęcia jednej liczby z długiego łańcucha zer, używamy "pomniejszonego dopełniacza radix", w systemie dziesiętnym dopełniacza dziewięciu.

Kiedy otrzymujemy liczbę odejmowaną od dużego łańcucha dziewiątek, musimy tylko odwrócić liczby.

Przykład: 99999 - 03275 = 96724

Dlatego po dopełnieniu nine dodajemy 1. Jak zapewne wiesz z matematyki z dzieciństwa, 9 staje się 10 przez "kradzież" 1. Więc w zasadzie to tylko dziesięć. dopełniacz, który bierze 1 Z różnicy.

W systemie binarnym dopełniacz dwójki jest równy dopełniaczowi dziesiątemu, natomiast dopełniacz jedynki-dopełniaczowi dziewiątemu. Podstawową różnicą jest to, że zamiast próbować wyodrębnić różnicę z potęgami dziesięciu (dodając 10, 100 itd. do równania) staramy się wyodrębnić różnicę potęgami dwóch

Z tego powodu odwracamy bity. Tak jak nasz minuend jest łańcuchem dziewiątek w układzie dziesiętnym, nasz minuend jest łańcuchem tych w formacie binarnym.

Przykład: 111111 - 101001 = 010110

Ponieważ łańcuchy jedynek są 1 poniżej ładnej potęgi dwójki, "kradną" 1 Z różnicy, tak jak dziewiątki w dziesiętnym.

Kiedy używamy ujemnych liczb binarnych, tak naprawdę mówimy:

0000-0101 = x

1111 - 0101 = 1010

1111 + 0000 - 0101 = x + 1111

Aby 'wyizolować' x, musimy dodać 1, ponieważ 1111 jest o jeden od 10000 i usuwamy wiodącą 1, ponieważ dodaliśmy to do pierwotnej różnicy.

1111 + 1 + 0000 - 0101 = x + 1111 + 1

10000 + 0000 - 0101 = x + 10000

Po prostu usuń 10000 z obu stron, aby uzyskać x, to podstawowa algebra.

 3
Author: KyBrooks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-26 03:50:54

Wiele odpowiedzi do tej pory ładnie wyjaśnia, dlaczego dopełniacz two jest używany do reprezentowania liczby ujemnej, ale nie mówi nam, czym jest dopełniacz two, szczególnie Nie dlaczego dodaje się "1", a w rzeczywistości często dodaje się go w niewłaściwy sposób.

Zamieszanie wynika ze złego zrozumienia definicji liczby dopełniającej. Dopełnienie to brakująca część, która uczyniłaby coś kompletnego.

Dopełniacz radix n cyfry x w radix b jest, z definicji, b^n-x. W binarnym 4 jest reprezentowane przez 100, który ma 3 cyfry (n=3) i radix 2 (b=2). Jego dopełniacz radix to b^n-x = 2^3-4=8-4=4 (lub 100 w binarnym).

Uzyskanie dopełniacza radix w układzie binarnym nie jest tak proste, jak uzyskanie dopełniacza Radix zmniejszonego, który jest zdefiniowany jako (b^n-1) - y, tylko o 1 mniej niż dopełniacz radix. Aby uzyskać zmniejszone dopełnienie radix, wystarczy odwrócić wszystkie cyfry.

100 -> 011 (zmniejszona (jedna) dopełniacz radix)

Aby uzyskać dopełnienie radix (two ' S), po prostu dodajemy 1, jak zdefiniowano definicję.

011 +1 ->100 (dopełnienie dwóch).

Teraz z tym nowym zrozumieniem, przyjrzyjmy się przykładowi podanemu przez Vincent Ramdhanie (patrz wyżej druga odpowiedź)

/* początek Vincenta

Przeliczenie 1111 na dziesiętne:

Liczba zaczyna się od 1, więc jest ujemna, więc znajdujemy dopełniacz 1111, który jest 0000. Dodaj 1 do 0000, a otrzymamy 0001. Konwertuj 0001 na dziesiętne, czyli 1. Zastosuj znak = -1. Tada!

Koniec Vincenta * /

Należy rozumieć jako

Liczba zaczyna się od 1, więc jest ujemna. Wiemy więc, że jest to dopełnienie dwójki o pewnej wartości x. aby znaleźć x reprezentowane przez dopełnienie dwójki, najpierw musimy znaleźć dopełnienie jedynki.

Dopełniacz dwójki z X: 1111 dopełnienie x: 1111-1 - >1110; x = 0001, (Odwróć wszystkie cyfry)

Zastosuj znak -, a odpowiedź = - x =-1.

 3
Author: user779764,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-14 19:06:13

Słowo dopełnienie wywodzi się z dopełnienia. W świecie dziesiętnym cyfry od 0 do 9 stanowią uzupełnienie (kompletny zestaw) cyfr lub symboli numerycznych, aby wyrazić wszystkie liczby dziesiętne. W świecie binarnym cyfry 0 i 1 stanowią dopełniacz cyfr do wyrażania wszystkich liczb binarnych. W rzeczywistości symbole 0 i 1 muszą być używane do reprezentowania wszystkiego (tekstu, obrazów itp.), jak również dodatnich (0) i ujemnych (1). W naszym świecie puste miejsce na lewo od liczba jest traktowana jako zero:

                  35=035=000000035.

W miejscu przechowywania komputera nie ma pustego miejsca. Wszystkie bity (cyfry binarne) muszą mieć wartość 0 LUB 1. W celu efektywnego wykorzystania numerów pamięci mogą być zapisywane jako reprezentacje 8-bitowe, 16-bitowe, 32-bitowe, 64-bitowe, 128-bitowe. Gdy liczba zapisana jako 8-bitowa jest przenoszona do 16-bitowej lokalizacji, znak i wielkość (wartość bezwzględna) muszą pozostać takie same. Ułatwiają to zarówno reprezentacje dopełniacza 1, jak i dopełniacza 2. Jako rzeczownik: Obie 1 dopełniacz i dopełniacz 2 są binarnymi reprezentacjami wielkości podpisanych, gdzie najbardziej znaczącym bitem (tym po lewej) jest bit znakowy. 0 oznacza dodatni, a 1-ujemny. dopełniacz 2s nie oznacza ujemnego . Oznacza ilość podpisaną. Podobnie jak w dziesiętnym wielkość jest reprezentowana jako liczba dodatnia. Struktura używa rozszerzenia sign do zachowania ilości podczas promowania do rejestru [] z większą liczbą bitów:

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

Jako czasownik: Dopełniacz 2 oznacza negować . To nie znaczy, że negatywne. Oznacza to, że jeśli ujemne, to dodatnie; jeśli dodatnie, to ujemne. Wielkość jest wartością bezwzględną:

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

Ta zdolność pozwala na efektywne odejmowanie binarne za pomocą negate następnie dodać. a-b = A + (- b)

Oficjalnym sposobem na wzięcie dopełniacza 1 jest odjęcie każdej cyfry od 1.

        1'scomp(0101) = 1010.

Jest to to samo co odwrócenie lub odwrócenie każdego bitu z osobna. Skutkuje to ujemnym zerem, które jest niezbyt lubiany, więc dodanie jednego do dopełnienia te 1 pozbawia problemu. Aby negować lub wziąć dopełniacz 2s najpierw weź dopełniacz 1s, a następnie dodaj 1.

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

W przykładach negacja działa również ze znakami rozszerzonymi.

Dodanie:
1110 Carry 111110 Carry 0110 to to samo co 000110 1111 111111 suma 0101 suma 000101

Odejmowanie:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

Zauważ, że podczas pracy z dopełniaczem 2, spacja po lewej stronie liczby jest wypełniona zerami dla liczb dodatnich, ale jest wypełniona jedynkami dla liczb ujemnych. Carry jest zawsze dodawany I musi być albo 1 lub 0.

Na zdrowie

 3
Author: Russ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-13 23:29:04

Dopełniacz

2 jest zasadniczo sposobem na wymyślenie addytywnej odwrotności liczby binarnej. Zadaj sobie pytanie: biorąc pod uwagę liczbę w postaci binarnej (obecną w Miejscu Pamięci o stałej długości), jaki wzór bitowy, po dodaniu do oryginalnej liczby (w Miejscu Pamięci o stałej długości), sprawiłby, że wynik byłby zerem ? (w tym samym miejscu pamięci o stałej długości). Jeśli moglibyśmy wymyślić ten wzorzec bitowy, to ten wzorzec bitowy byłby reprezentacją-ve (addytywną odwrotnością) oryginału Liczba; ponieważ z definicji dodanie liczby do jej addytywnej odwrotności zawsze skutkuje zerem. Przykład: weźmy 5, które jest 101 obecne w pojedynczym 8-bitowym bajcie. Teraz zadaniem jest stworzenie wzorca bitowego, który po dodaniu do podanego wzorca bitowego (00000101) spowoduje, że wszystkie zera w miejscu pamięci, które jest używane do przechowywania tego 5 , tzn. wszystkie 8 bitów bajtu powinno wynosić zero. Aby to zrobić, zacznij od prawej większości bitów 101 i dla każdego pojedynczego bitu ponownie zadaj to samo pytanie: Co bit czy powinienem dodać do bieżącego bitu, aby wynik był zerowy ? kontynuuj to, biorąc pod uwagę zwykłe przeniesienie. Po tym, jak skończymy z trzema prawymi większością miejsc (cyframi, które definiują liczbę pierwotną bez względu na początkowe zera), Ostatnie przeniesienie idzie we wzorze bitowym odwrotności addytywnej. Co więcej, ponieważ trzymamy w oryginalnej liczbie w jednym 8-bitowym bajcie, wszystkie pozostałe bity wiodące w addytywnej odwrotności również powinny być 1, tak że (i to jest ważne), gdy komputer dodaje "liczbę" (reprezentowaną za pomocą 8-bitowego wzorca) i jej odwrotność addytywną za pomocą" tamtego " typu pamięci (bajt a), wynikiem w tym bajcie będą wszystkie zera.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0
 3
Author: n-mam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-04 14:06:48

Podobała mi się odpowiedź lavinio, ale przesuwanie bitów dodaje trochę złożoności. Często istnieje wybór poruszających się bitów, respektując bit znaku lub nie respektując bit znaku. Jest to wybór pomiędzy traktowaniem liczb jako podpisanych (od -8 do 7 dla skubania, od -128 do 127 Dla bajtów) lub pełnozakresowych liczb niepodpisanych (od 0 do 15 dla skubania, od 0 do 255 dla bajtów).

 2
Author: Nosredna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-26 15:49:10

Jest to sprytny sposób kodowania ujemnych liczb całkowitych w taki sposób, że około połowa kombinacji bitów typu danych jest zarezerwowana dla ujemnych liczb całkowitych, a dodanie większości ujemnych liczb całkowitych z odpowiadającymi im dodatnimi liczbami powoduje przepełnienie, które pozostawia wynik binarny zero.

Tak więc, w dopełniaczu 2, Jeśli jeden jest 0x0001, to -1 jest 0x1111, ponieważ spowoduje to łączną sumę 0x0000 (z przepełnieniem 1).

 2
Author: Edwin Buck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-20 09:10:41

W skrócie 2's Complement jest sposobem na przechowywanie liczby ujemnej w pamięci komputera. Natomiast liczby dodatnie są przechowywane jako normalna liczba binarna.

Rozważmy ten przykład,

Komputer używa Binary Number System do reprezentowania dowolnej liczby.

x = 5;

To jest reprezentowane jako 0101.

x = -5;

Kiedy komputer encouters - znak, oblicza to dopełniacz 2 i zapisuje go. i.e 5 = 0101, a dopełnieniem 2 jest 1011.

Ważne zasady komputer używa do liczby procesów to:

  1. Jeśli pierwszy bit to 1, to musi to być negative liczba.
  2. jeśli wszystkie bity oprócz pierwszego są 0, to jest liczbą dodatnią ponieważ nie ma -0 w systemie liczbowym.(1000 is not -0 zamiast tego jest dodatnia 8)
  3. jeśli wszystkie bity są 0, to jest 0.
  4. Else it is a positive number.
 1
Author: Raghu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-26 17:21:25

Dopełniacz dwójki jest jednym ze sposobów wyrażania liczby ujemnej, a większość kontrolerów i procesorów przechowuje liczbę ujemną w postaci dopełniacza dwójki

 1
Author: Denis Roosevelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-13 17:31:39

Dopełniacz Two używany jest głównie z następujących powodów:

  1. aby uniknąć wielokrotnych reprezentacji 0
  2. aby uniknąć śledzenia bitu nośnego (jak w dopełnieniu) w przypadku przepełnienia.
  3. wykonywanie prostych operacji, takich jak dodawanie i odejmowanie, staje się łatwe.
 1
Author: K.N. Bhargav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-15 09:35:24

Odniesienie: https://www.cs.cornell.edu / ~tomf/notes/cps104/twoscomp.html

Odwracam wszystkie bity i dodaję 1. Programowo: {]}

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;
 0
Author: Charles Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-30 18:31:29

2 dopełnieniem danej liczby jest no. otrzymałem przez dodanie 1 z dopełnieniem nr 1. Załóżmy, że mamy binarne nr.: 10111001101 Dopełniacz 1 to : 01000110010 A dopełnieniem 2 będzie : 01000110011

 0
Author: 2 revsuser10862846,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-31 02:58:25

Dopełnienie bitowe liczby polega na odwróceniu wszystkich znajdujących się w niej bitów. Do dopełnienia dwójki odwracamy wszystkie bity i dodajemy jeden.

Używając reprezentacji dopełniacza 2 dla podpisanych liczb całkowitych, stosujemy operację dopełniacza 2 do konwersji liczby dodatniej na jej ujemny odpowiednik i odwrotnie. Tak więc używając nibbles dla przykładu, 0001 (1) staje się 1111 (-1) i stosując op ponownie, zwraca 0001.

Zachowanie operacji na poziomie zera jest korzystne w dawaniu pojedynczego reprezentacja dla zera bez specjalnej obsługi zer dodatnich i ujemnych. 0000 uzupełnia do 1111, które po dodaniu 1. przepełnia się do 0000, dając nam jedno zero, a nie dodatnie i ujemne.

Kluczową zaletą tej reprezentacji jest to, że standardowe obwody dodawania dla niepodpisanych liczb całkowitych dają prawidłowe wyniki, gdy są stosowane do nich. Na przykład dodanie 1 i -1 W nibbles: 0001 + 1111, bity przepełniają się z rejestru, pozostawiając 0000.

Dla delikatne wprowadzenie, wspaniały Computerphile wyprodukował wideo na ten temat.

 0
Author: ahcox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-15 20:42:45

Możesz również użyć kalkulatora online, aby obliczyć binarną reprezentację dopełniacza dwójki liczby dziesiętnej: http://www.convertforfree.com/twos-complement-calculator/

 -2
Author: Chad Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-22 00:33:42

Najprostsza odpowiedź:

1111 + 1 = (1)0000. Więc 1111 musi być -1. Następnie -1 + 1 = 0.

To jest idealne, aby zrozumieć to wszystko dla mnie.

 -6
Author: Dmitry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 17:31:01