globekes
Artikelen: 0
Berichten: 20
Lid geworden op: di 21 aug 2007, 17:47

2-complement (binaire getallen)

Hallo,

Ik snap deze methode niet zo best, zou iemand zo vriendelijk willen zijn mij dit eens uit te leggen?

Mijn probleem:

-negatieve getallen:

2 complement zegt: Het 1 complement getal omkeren(not operator) en dan plus 1 en je hebt het 2 complement neg getal.

Maw voor -6 bekom je dus:

6: 0110

omkeren: 1001

plus 1: 1010

dit is dus -6, maar is dit dan ook 10????

-2e probleem: optellen

6+(-6)=0

0110

1010

------

10000 maar dit is toch niet 0 hoe komt dat dan?

terwijl:7+(-6)=1

0111

1010

------

10001 dit is toch ook niet 1???

Wat is mijn fout?
globekes
Artikelen: 0
Berichten: 20
Lid geworden op: di 21 aug 2007, 17:47

Re: 2-complement (binaire getallen)

help aub, heb morgen examen
Gebruikersavatar
qrnlk
Lorentziaan
Artikelen: 0
Berichten: 5.079
Lid geworden op: vr 14 jul 2006, 14:35

Re: 2-complement (binaire getallen)

unsigned:

000 = 0

001 = 1

010 = 2

011 = 3

100 = 4

101 = 5

110 = 6

111 = 7

signed:

0 00 = +0

0 01 = +1

0 10 = +2

0 11 = +3

1 00 = -4

1 01 = -3

1 10 = -2

1 11 = -1

dus 110 kan zowel 6 als ook -2 betekenen afhankelijk van de interpretatie. (zie ook Wikipedia)

(Voor wie echt intresse heeft: Balanced Ternary zou een veel natuurlijker systeem zijn. Zelfs de rekenregels zouden dan eenvoudiger zijn.)
Any sufficiently analyzed magic is indistinguishable from science.

Any sufficiently advanced technology is indistinguishable from magic.



There is no theory of protecting content other than keeping secrets – Steve Jobs
Gebruikersavatar
Cycloon
Artikelen: 0
Berichten: 4.810
Lid geworden op: ma 24 jan 2005, 20:56

Re: 2-complement (binaire getallen)

Je redenering klopt volledig.

6+(-6)=0

0110

1010

------

10000

Die 1 moet je laten vallen. Je begint met 4 bits, dus je moet ook met 4 bits eindigen. Waarschijnlijk ben je gestart met een 4 bit systeem. Dit wil zeggen dat die computer slechts 4 bits kan onthouden in z'n berekening. Wanneer hij nu deze optelling maakt zal hij enkel 0000 bekomen. Wat dus klopt!
Maw voor -6 bekom je dus:

6: 0110

omkeren: 1001

plus 1: 1010

dit is dus -6, maar is dit dan ook 10????
1010 is niet -6! 1010 is het 2-complement van 6. In binaire getallen is 10 dus het 2-complement van 6.

@ qrnlk: Het gaat hier over complement rekenen, niet over het verwerken van negatieve getallen pi.gif Eigelijk is -6 niet 1010, maar 1010 is het 2 complement van 6. Wanneer je nu een aftrekking met 6 doet dan doet de pc een optelling met z'n 2 complement. Dit werkt ook voor het 10-tallig stelsel. Bv 9-6 kan je ook uitrekenen als 9+4 en de eerste 1 laten vallen.
globekes
Artikelen: 0
Berichten: 20
Lid geworden op: di 21 aug 2007, 17:47

Re: 2-complement (binaire getallen)

Dank je!

Maar als 1010 niet echt -6 is wat is dan wel -6?

Of rekent een computer niet negatief?
Gebruikersavatar
Cycloon
Artikelen: 0
Berichten: 4.810
Lid geworden op: ma 24 jan 2005, 20:56

Re: 2-complement (binaire getallen)

globekes schreef:Dank je!

Maar als 1010 niet echt -6 is wat is dan wel -6?

Of rekent een computer niet negatief?


Een computer kent niet echt negatieve getallen. Men moet altijd een afspraak maken. In de geschiedenis zijn er verschillende afspraken geweest, maar het huidige systeem gebruikt toevallig ook een complement systeem pi.gif . Maar laten we het simpel houden. Stel nu dat je een 4 bit systeem zou hebben dan gebruik je 1 bit als teken, en 3 bits als een getal. Stel je hebt 1100. Hierbij stelt de rode 1 het teken voor en de groene 3 bits het getal. Hier staat dus niet 12 maar -4. 1 is negatief, 0 is positief. Als je het echt wil weten moet je maar even googlen, valt veel info over te vinden :D
Gebruikersavatar
qrnlk
Lorentziaan
Artikelen: 0
Berichten: 5.079
Lid geworden op: vr 14 jul 2006, 14:35

Re: 2-complement (binaire getallen)

@ qrnlk: Het gaat hier over complement rekenen, niet over het verwerken van negatieve getallen :D
Ik beantwoorde de eerste vraag. Jouw antwoord is vollediger.
Eigelijk is -6 niet 1010, maar 1010 is het 2 complement van 6 [110]. Wanneer je nu een aftrekking met 6 [110] doet dan doet de pc een optelling met z'n 2 complement [1010]. Dit werkt ook voor het 10-tallig stelsel. Bv 9-6 kan je ook uitrekenen als 9+4 en de eerste 1 laten vallen.
pi.gif Ik heb geprobeerd het even iets duidelijker te maken door dingen die hetzelfde betekenen ook dezelfde kleur te geven. (De 10-complement van 6 is dus 4.)
Any sufficiently analyzed magic is indistinguishable from science.

Any sufficiently advanced technology is indistinguishable from magic.



There is no theory of protecting content other than keeping secrets – Steve Jobs
globekes
Artikelen: 0
Berichten: 20
Lid geworden op: di 21 aug 2007, 17:47

Re: 2-complement (binaire getallen)

bedankt, één van de vroegere examenvragen was namelijk om -76 binair te schrijven. Maar nu weet ik hoe het moet;

Had al eens gekeken op wikipedia maar verstond niet echt hoe -6 ook 10 kon zijn, binair dan.

Nu is het in orde.
Gebruikersavatar
Cycloon
Artikelen: 0
Berichten: 4.810
Lid geworden op: ma 24 jan 2005, 20:56

Re: 2-complement (binaire getallen)

globekes schreef:bedankt, één van de vroegere examenvragen was namelijk om -76 binair te schrijven. Maar nu weet ik hoe het moet;

Had al eens gekeken op wikipedia maar verstond niet echt hoe -6 ook 10 kon zijn, binair dan.

Nu is het in orde.
Natuurlijk moet je wel even zoeken met welk systeem je dat moet doen.

Edit: Ik heb het even opgezocht. De huidige systemen werken met de 2-complement codering. Dat wil zeggen dat als 1 = 001 dat -1 = 111 (2 complement). Eigenlijk is die 1010 in jouw voorbeeld dus werkelijk -6, alleen kan die in een 4 bit systeem geen 10 meer zijn omdat je bereik daar niet groot genoeg voor is (je zou maximum tot 7 kunnen gaan positief en -8 negatief).
Gebruikersavatar
qrnlk
Lorentziaan
Artikelen: 0
Berichten: 5.079
Lid geworden op: vr 14 jul 2006, 14:35

Re: 2-complement (binaire getallen)

Cycloon schreef:Natuurlijk moet je wel even zoeken met welk systeem je dat moet doen.

Edit: Ik heb het even opgezocht. De huidige systemen werken met de 2-complement codering. Dat wil zeggen dat als 1 = 001 dat -1 = 111 (2 complement). Eigenlijk is die 1010 in jouw voorbeeld dus werkelijk -6, alleen kan die in een 4 bit systeem geen 10 meer zijn omdat je bereik daar niet groot genoeg voor is (je zou maximum tot 7 kunnen gaan positief en -8 negatief).
pi.gif Dat is dus wat ik bedoelde met mijn post.
Any sufficiently analyzed magic is indistinguishable from science.

Any sufficiently advanced technology is indistinguishable from magic.



There is no theory of protecting content other than keeping secrets – Steve Jobs
*gast_Nico_*
Artikelen: 0

Re: 2-complement (binaire getallen)

Goed verhaal inzake de uitleg, oook ik heb er wat aan gehad.

Maar kan iemand mij in simpele mensen taal vertellen wat het verschil is tussen 1 complement en 2 complement? En kun je stellen dat we dus eigenlijk altijd een tegen waarde maken voor een positieg getal? Dus elk positief getal heeft een vaste partner als negatief getal die we op een bepaalde manier berekenen??

Groet,

Nico.
moppersmurf
Artikelen: 0
Berichten: 6
Lid geworden op: wo 28 mei 2008, 10:33

Re: 2-complement (binaire getallen)

Beste Nico

het antwoord op je vraag kan intussen al gevonden zijn, maar ik dacht laat ik toch nog maar even posten.

voor zowel tweecomplement als ééncomplement verander je elke 1-bit naar een 0-bit en de 0-bit verander je naar een 1-bit. Voor het tweecomplement echter tel je bij je volledige omzetten één 1-bit bij. Dus helemaal rechts in je binaire reeks.

En afhankelijk van het gekozen complement kan je dus een "tegenwaarde" opstellen. Dat beperkt echter wel je binaire reeks. Aangezien je met 4 bits een getal tot en met 16 kan bekomen moet je hier een compromis stellen dat we dus te maken kunnen hebben met zowel negatieve als positieve getallen. Zoals eerder al gezegd werd, werken we dan met een tekenbit helemaal links in de binaire reeks.

Om dus de zogezegde negatieve tegenwaarde van een binaire reeks met een 0-bit als tekenbit op te stellen, kiezen we ofwel voor het ééncomplement of tweecomplement.

zo heeft 0001 de positieve waarde 1

en als 1-complement geeft dit 1110, wat we kunnen opvatten als -1.

Echter met het 2-complement geeft dit 1111 (we tellen 1-bit bij het 1-complement) met waarde -1.

Afhankelijk van de gekozen reeks kan je hier dus kiezen welke waarde je neemt.

groet,

Moppersmurf
Gebruikersavatar
Schwartz
Artikelen: 0
Berichten: 691
Lid geworden op: di 14 mar 2006, 18:14

Re: 2-complement (binaire getallen)

Bij een normale variabele kunnen we geen +0 en -0 hebben en hebben we daarom maar ene 0 in de reeks.

Het zou erg onhandig zijn geweest als een binaire codering bij 000000 etc een negatief getal zou voorstellen omdat er dan moeilijke conversie problemen gaan ontstaan tussen verschillende typen.

En 000000 als negatief getal is ook niet handig bij and en or verwerkingen.

Een var die dan 0 is heeft dan ergens een 1 staan in de codering en dat is voor een programmeur bullshit.

Er zijn typen die wel een +0 en -0 hebben maar die worden gebruikt bij speciale berekeningen die een nauwkeurige balans nodig hebben.

Meestal hebben die ook tig cijfers achter de komma die exact in balans zijn.

Dus bijvoorbeeld -10.000000 tot +10.000000

en men kan dan ook nog eens de Exxx met + en - instellen.

Met deze techniek weet men precies dat na een deling de waarde + of - is ook al is het getal kleiner dan de computer nog aan kon.

Computers hebben nu eenmaal niet oneindige getallen.

(ook kan men typen hebben die men een getal op oneindig + en - kan instellen)

Het houden van een balans is bij sommige berekeningen erg belangrijk om afwijkingen in het resultaat te voorkomen.

Voorbeeld:

sign(-1)*7 is -7

sign(-0)*7 is -7.

Bij normale variabelen zou men -7 en 0 bekomen, maar doordat de 0 zowel + als - kan zijn heeft men nooit een sign die 0 geeft als men die speciale type toepast.
Een computertaal is voor mensen, niet voor de computer.
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: 2-complement (binaire getallen)

Bij een normale variabele kunnen we geen +0 en -0 hebben en hebben we daarom maar ene 0 in de reeks.
Het heeft weinig met 'kunnen' te maken en alles met 'willen'.
Het zou erg onhandig zijn geweest als een binaire codering bij 000000 etc een negatief getal zou voorstellen omdat er dan moeilijke conversie problemen gaan ontstaan tussen verschillende typen.
Er is werkelijk geen enkel probleem met het hebben van een representatie waarbij 000000 een negatief getal is om precies dezelfde reden dat er geen enkel probleem is met bitreeksen karakters, soorten appels, enz. weer te geven.
En 000000 als negatief getal is ook niet handig bij and en or verwerkingen
And en Or zijn binaire operaties op bits. Als je ze ook wilt gebruiken op andere dingen, zul je hoe dan ook aan moeten geven hoe dat dan werkt.
Een var die dan 0 is heeft dan ergens een 1 staan in de codering en dat is voor een programmeur bullshit.
Wat een onzin. Als je een representatie gebruikt waarbij het bovenstaande gebeurt dan houdt je daar als programmeur dus rekening mee...
Er zijn typen die wel een +0 en -0 hebben maar die worden gebruikt bij speciale berekeningen die een nauwkeurige balans nodig hebben.
Voorbeeld?
Meestal hebben die ook tig cijfers achter de komma die exact in balans zijn.

Dus bijvoorbeeld -10.000000 tot +10.000000

en men kan dan ook nog eens de Exxx met + en - instellen.
Hier lijkt het er op dat je het hebt over floating point getallen. Deze hebben een sign-bit en zijn dan volgens jou automatisch 'in balans'.
Met deze techniek weet men precies dat na een deling de waarde + of - is ook al is het getal kleiner dan de computer nog aan kon.
Als het getal kleiner was dan de computer aan kon dan moet je misschien sowieso niet naar het antwoord van de deling kijken (maar gewoon je antwoord genereren op basis van de oorspronkelijke getallen).
Bij normale variabelen zou men -7 en 0 bekomen, maar doordat de 0 zowel + als - kan zijn heeft men nooit een sign die 0 geeft als men die speciale type toepast.
Maar daarbij maak je dus impliciet de aanname dat je een sign gebruikt die geen 0 zal teruggeven. Dat hoeft natuurlijk niet het geval te zijn. Je kunt ook best met een sign werken waarbij sign(0) = sign(-0) =0.

Terug naar “Informatica en programmeren”