Hogy működik a bitenkénti negálás (c-ben)?
"Hülyeség, hogy az egyesével történő negálással más eredmény jön ki mint az egy lépésben történttel."
Pfff..
Na, ezek vagytok ti..
" Mért lenne más eredmény?"
Majd tanulsz egy kicsit, ha érdekel és akkor talán rájössz.
" Egyébként nem hiszem hogy a kérdező egyesével negálta volna a biteket."
Most már én sem, ezért írtam amit írtam.
És hát, nem, az egyes komplemens az nem egy "számábrázolás".
Kérdező, nagyon leegyszerűsítve a lényeg:
Az egyes komplemens azt jelenti, hogy a legnagyobb helyiértéken lévő bit az előjel, és a bitek negálásával előjelet tudunk váltani.
+2 - 0000 0010
-2 - 1111 1101
Ez tök jó lenne, csak a nulla így kétféle értéket is felvehet (+0 és -0), és egyesével számolva ott lesz egy hiba:
2 - 0000 0010
1 - 0000 0001
0 - 0000 0000 // ez nulla
0 - 1111 1111 // ez is nulla !!
-1 - 1111 1110
Ezért találták ki a kettes komplemenst, ahol a negatív számokat eltolják eggyel, hogy stimmeljen a sorozat. (Ezért kell kettes komplemens képzésnél egyet hozzáadni.)
Kettes komplemens ábrázolásban így néznek ki a számok a nulla közelében, lefelé számolva:
2 - 0000 0010
1 - 0000 0001
0 - 0000 0000
-1 - 1111 1111 // (itt is ugyanúgy fordulnak a bitek, mintha a kilométerórát forgatnád visszafelé)
-2 - 1111 1110
Emiatt ha a 16 értéket bitenként invertálod, akkor egyes komplemens formájú számokkal kapnál -16 értéket, de a processzor nem így fogja értelmezni, a fenti okok miatt. Ő kettes komplemensként fogja értelmezni, ami abszolút értékben eggyel el van "tolva".
"nem pedig a teljes változót egy lépésben a "~" (negáció) operátorral. [...] Utóbbi ugyanis az operandus kettes komplemensét adja eredményül."
~
Binary Ones Complement Operator is unary and has the effect of 'flipping' bits.
Nos A kérdés a következő. C-ben a bitenkénti negáció miért ad 16-ra -17-et eredményül?
Ha megnegálod a biteket(~) akkor az 1->0, 0->1 lesz.
Példa:
0001 0000 ; 16
1110 1111 ; -17
De akkor mégis miért lesz -17?
Nos a számítógépnek valahogyan tárolnia kell a negatív, pozitív számokat, és közben azt is figyelembe kell venni hogy a processzor csak összeadni, és negálni tud, és erre visszavezettek minden műveletet. A kettes, eggyes komplemens pont erre valóak, ezzekkel a kivonást is összeadásra vezették vissza, és mivel az eggyes komplemens a bitenkénti negálásnak felel meg, igy mikor megnegálod akkor a szám eggyes komplemenset kapod meg.
DEE VISZONT!!
Ha csak eggyes komplemensben dolgozna a számítógép, akkor 2db 0 lenne a számegyenesen,ami nekünk nem éppen jó, igy jön képbe a kettes komplemens amivel eltolják a negativ számokat eggyel. De ez a negálás folyamán nem fog megtörténni, csak akkor mikor értelmezni probálod azt a bit sorozatot számként.
A számitógépen a számegyenes valahogy igy néz ki:
10000000[-128] ... 11111111[-1] 00000000[0] ... 01111111[127]
Szóval a negálás helyesen müködött, de mikor számként értelmezed akkor mindig a kettes komplemenset fogja kiírni. Ezek persze most mind előjeles számok. ( A legnagyobb bit az előjelbit [0:+,1:-]).
További kérdések:
Minden jog fenntartva © 2025, 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!