El tudja v. ki magyarázni pontosan mi is az a kettes komplemens?
Azt tudom hogyan kell képezni, de nem értem miért kell először megfordítani a biteket, aztán hozzáadni egyet. Ugye ezt kell hozzáadni az eredeti kissebbítendőhöz. Ezzel összeadásra vezettem vissza egy kivonást. Ezt tízes számrendszerben is meg lehet csinálni.
Például: 8-3=5, 8+(-3)=5. Ezért logikus lenne, ha a kettes komplemens a szám ellentettje lenne. Ezt sem értem, mert egy kettes k. teljesen úgy néz ki, mint egy normál pozitív szám. Na mármost, ha ezt hozzáadom az eredeti kissebbítendőhöz, nem a kivonás eredménye jön ki, hanem egy teljesen másik összeadás eredménye. Ezért kell lehúzni a túlcsordult biteket. De ennek az egésznek nem értem a logikáját.
#2/1: Igen, vannak egyszerű esetek, mint például:
1110 =14 egyes k.:1011 1110
-0100 =4 kettes k.:1100 =-4 +1100
11010=1010 =10(dec)
Ez teljesen világos, 0100 kettes komplemense(ellentettje)1100. Csak az előjelbit változott. De vannak nehezebb esetek:
1010110 =86 e.k.:1001100 1010110
-0110011 =51 k.k.:1001101=-13 +1001101
10100011=100011 =35
Az eredeti kivonandó dec.-be átszámolva 51, de a kettes komplemense -13. Legalábbis nekem úgy tűnik, mert ott a negatív előjelbit(1) és utána a 001101 13-at jelent, nem 51-et. Viszont kijön a várt eredmény(35).
Vagy egy másik példa:
110001
110001 =49 e.k.:001100 +001101
-110011 =51 k.k.:001101=+13 111110 =-2
Az eredeti kivonandó itt is 51 és a kettes komplemense is 13, csak +13 a pozitív előjelbit miatt(0). De lehet egyáltalán kettes k. pozitív? Mert annak nem sok értelmét látnám. Az eredmény -2. De ha nem váltottam volna át az egészet dec-be, és nem tudtam volna, hogy -2 nek kell kijönnie, honnan tudtam volna mennyi az előjelbit az öt darab egyesből? Meg tudnád ezeket magyarázni?
#2/2: Bocsánat, de nem igazán értettem a válaszodat. 12 éves vagyok és nem tudok programozni. Mi az az unsigned max int? Kifejtenéd egy kicsit bővebben a válaszod?
Első és legfontosabb: ha ránézel valami szám bináris reprezentációjára, te nem fogod azt megmondani, hogy az most előjeles, k.k., offset vagy mi. Attól függ, hogy hogy értelmezed.
Kettő: ez az egész cucc a digitális technikában gyökerezik, ahol például meg akarsz etetni egy összeadóval 2 bináris számot, és nem árt, ha a jó eredmény jön ki.
Az, hogy mondjuk (logikusan) egy negatív szám ugyanúgy néz ki, mint az abszolútértéke, csak az előjelbit különbözik, az egy korrekt felírás, csak a műveletvégzés eléggé nehézkes vele. Erre jó a kettes komplemens.
Innen az utolsó diáig ha megnézed, szerintem érteni fogod.
Esetleg ha nem világos, próbáld összehasonlítani, hogy mondjuk 4 biten csak pozitív számokat ábrázolunk (0)-(15) (ez az unsigned = előjel nélküli) és a kettes komplemenst (-8)-(7)
(a pont csak az igazítás miatt van)
US BINR KK
15 1111 -1
14 1110 -2
13 1101 -3
12 1100 -4
11 1011 -5
10 1010 -6
.9 1001 -7
.8 1000 -8
.7 0111 7
.6 0110 6
.5 0101 5
.4 0100 4
.3 0011 3
.2 0010 2
.1 0001 1
.0 0000 0
A számok sorrendjét ha megfigyeled, szerintem minden érthetőbb.
A számtartomány felső felében a negatív számokat ábrázoljuk (vagy jobban mondva inkább a számtartomány felső felét _értelmezzük_ negatívként).
Ha mondjuk írásban az 1111-hez kellene adnod 0001-et, mit csinálnál?
Szépen összeadnád, kijönne, hogy 10000, viszont az utolsó (legfelső) bit nem fér sehova, úgyhogy simán 0000 lesz -> KK -> -1 + 1 = 0000
Köszönöm szépen a magyarázatot, kezdem érteni.
De ennél a kivonásnál valamiért sehogy sem jött ki a jó eredmény: 10110-100111. Megoldanád nekem?
Az egyes komplemenst úgy kapod, hogy a bitek ellentettjét veszed.
A kettes komplemenst pedig úgy, hogy az egyes komplemenshez hozzáadsz egyet.
Kivonás összeadásra való visszavezetése:
Két számot úgy tudsz kivonni egymásból, ha veszed a kivonás második tagjának a kettes komplemensét.
Hogy mért nem jó csak egyes komplemenst használni, nos a legegyszerűbb ezt belátni úgy, hogy mondjuk van 8 bited és mondjuk 8-ból ki akarsz vonni nullát.
Mi is a nulla 1-es komplemense? (1 1 1 1 | 1 1 1 1)
Látható, hogy ha ezt hozzáadod a (0 0 0 0 | 1 0 0 0)-hoz, akkor nem 8-at fogsz kapni, hanem (0 0 0 0 | 0 1 1 1)-et, azaz 7-et. De ha hozzáadsz 1-et (ez a kettes komplemens), akkor a csupa 1-esből 0 lesz, és úgy már kijön az eredmény.
De az egyes komplemenses esetben miért jön ki 7? Nos azért mert a csupa 1-es egy akárhány bites (fixpontos) típusban -1. Ezt be is tudjuk bizonyítani, ugyanis 8-ból mit kell kivonni, hogy 7-et kapjak? 1-et:
(0 0 0 0 | 0 0 0 1) -> (+1)
(1 1 1 1 | 1 1 1 0) -> egyes komplemens
(1 1 1 1 | 1 1 1 1) -> kettes komplemens (-1)
Meg is kaptuk a mínusz 1-et.
Nézzünk még 1 példát, vonjunk ki 8-ból 2-őt:
(0 0 0 0 | 0 0 1 0) -> (+2)
(1 1 1 1 | 1 1 0 1) -> egyes komplemens
(1 1 1 1 | 1 1 1 0) -> kettes komplemens (-2)
(0 0 0 0 | 1 0 0 0) + (+8)
(0 0 0 0 | 0 1 1 0) = 6
Szóval nem mást használunk ki ilyenkor, mint a túlcsordulást. Mivel 9. bitre esne az az 1-es, ennél az utolsónál, de nincs 9. bitünk, így azzal nem kell foglalkoznunk.
Másik szemszögből magyarázva:
+8-nak a negáltja (egyes komplemense) 247 (most felejtsük az előjel bitet egy pillanatra). Egymást 255-re egészítik ki, ami 8biten a legmagasabb ábrázolható szám.
Tegyük fel 20-8 eredményét akarjuk => +12
20 + 247(ez a negáltja a 8-nak) = 267 => túlcsordultunk!
267 kettes számrendszerben ábrázolva:
(1 | 0 0 0 0 | 1 0 1 1)
Ha a 9. bitet nem ábrázoljuk (nem is tudjuk 8 biten):
(0 0 0 0 | 1 0 1 0) = +11-et kapunk, +12 helyett.
A 9. bit értéke 256. 8 biten a legmagasabb ábrázolható szám 255. Mennyi is köztük a különbség? Pont egy. Tehát
a 9. bitet elfelejtjük, hozzáadunk 11-hez 1-et, és meg is kapjuk a 12-őt. (Ez pont a kettes komplemens, amit itt csináltunk).
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!