Springen naar inhoud

2-complement (binaire getallen)


  • Log in om te kunnen reageren

#1

globekes

    globekes


  • 0 - 25 berichten
  • 20 berichten
  • Gebruiker

Geplaatst op 21 augustus 2007 - 16:58

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?

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

globekes

    globekes


  • 0 - 25 berichten
  • 20 berichten
  • Gebruiker

Geplaatst op 21 augustus 2007 - 18:38

help aub, heb morgen examen

#3

qrnlk

    qrnlk


  • >5k berichten
  • 5079 berichten
  • Lorentziaan

Geplaatst op 21 augustus 2007 - 18:43

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

#4

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 21 augustus 2007 - 18:44

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.

Veranderd door Cycloon, 21 augustus 2007 - 18:53


#5

globekes

    globekes


  • 0 - 25 berichten
  • 20 berichten
  • Gebruiker

Geplaatst op 21 augustus 2007 - 19:01

Dank je!
Maar als 1010 niet echt -6 is wat is dan wel -6?
Of rekent een computer niet negatief?

#6

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 21 augustus 2007 - 19:09

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

#7

qrnlk

    qrnlk


  • >5k berichten
  • 5079 berichten
  • Lorentziaan

Geplaatst op 21 augustus 2007 - 19:15

@ 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

#8

globekes

    globekes


  • 0 - 25 berichten
  • 20 berichten
  • Gebruiker

Geplaatst op 21 augustus 2007 - 19:17

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.

#9

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 21 augustus 2007 - 19:18

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).

Veranderd door Cycloon, 21 augustus 2007 - 19:26


#10

qrnlk

    qrnlk


  • >5k berichten
  • 5079 berichten
  • Lorentziaan

Geplaatst op 21 augustus 2007 - 20:02

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

#11


  • Gast

Geplaatst op 13 oktober 2007 - 11:01

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.

#12

moppersmurf

    moppersmurf


  • 0 - 25 berichten
  • 6 berichten
  • Gebruiker

Geplaatst op 28 mei 2008 - 09:43

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

#13

Schwartz

    Schwartz


  • >250 berichten
  • 691 berichten
  • Verbannen

Geplaatst op 07 juni 2008 - 01:22

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.

#14

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 07 juni 2008 - 07:42

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.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures