Forumet - Hur en dator ränkar.

Hur en dator ränkar.

639 0 6
Mjae, det är väl så att datorer bara räknar logik med OR, AND och NOT i grunden. Dock känner jag mig som om att jag är ute på lite hal is i det hela, men jag ska försöka förklara hur jag tror att det är.

Jag orkar inte räkna med stora tal som du pekar på, så vi gör det såhär istället, 15-2.

15 i bas 2 är 1111 och 2 i bas två är 0010, för att göra en subraktion så drar du helt enkelt en NOT AND-operation där
1111
NOT AND
0010
är
1101.

Där varje 1 motsvarar 0 i det andra talet blir det 1 eftersom 1 och 0 är 0 och vi hade en inte framför, så det blir 1. Det fortsätter fram till tredje siffran där det är lika, och då blir tredje siffran 0, eftersom inte(1 och 1) är osant.

Förstår du?
kewtheiin:

Min lärare sa till mej idag att datorer i grund och botten bara räknar plus, Tex ränkar ut 42 - 15 med hjälpa av plus!


Adderaren i en ALU är en smart sak, den kan hantera både positiva och negativa tal med samma instruktioner utan att behöva någon särskild hårdvara för det. Detta sker med hjälp av något som kallas för tvåkomplementnotation.

Internt lagrar ju datorn alla tal binärt, dvs. som ettor och nollor. Om vi har ett fyra bits positivt heltal kan det som mest lagra 1111, dvs. 15.

Om vi nu istället vill använda våra fyra bits till att representera ett tal som kan vara antingen negativt eller positivt måste vi göra på ett speciellt sätt. Till att börja med bestämmer vi att den högsta biten, dvs. den längst till vänster, alltid är 0 om vi har ett positivt tal, och 1 om vi har ett negativt. Det innebär att de positiva talen går från 0000 (0) till 0111 (7). Resten av talen måste alltså vara negativa.

Men hur ska vi representera dem? Vi skulle helt enkelt kunna bestämma att 1000 är -0 och 1111 är -7, men då skulle vi, av diverse anledningar, behöva bygga väldigt krånglig hårdvara för att hantera talen. Istället gör vi såhär när vi vill veta hur ett negativt tal ska se ut.

1. Ta ett positivt tal, t ex 5, och skriv ned dess binära representation, som i fallet 5 råkar vara 0101.

2. Tag komplementet av det binära talet, dvs. varje nolla ändrar du till en etta, och varje etta till en nolla. Då får vi 1010.

3. Addera 1 till talet. Vi får då 1011, vilket är tvåkomplementsnotation för talet -5.

Därefter utför ALU:n bara, som Imgood säger, operationen x+(-5).

Gentlemen:

15 i bas 2 är 1111 och 2 i bas två är 0010, för att göra en subraktion så drar du helt enkelt en NOT AND-operation där
1111
NOT AND
0010
är
1101.


Det stämmer inte. Antag att du istället har 2 - 1, vilket binärt blir 10 - 01. Svaret blir naturligtvis 1, både decimalt och binärt, men 10 NAND 01 blir 11 (3 decimalt.)

Subtraktion utförs som tidigare påpekat just med hjälp av adderaren, och en adderare är ganska enkel att beskriva. Vi börjar med att bygga en adderare 1-bits adderare, och bygger därifrån vidare på den. I en 1-bits adderare har vi tre indata: bit X och bit Y som ska adderas, och bit C, som är lika med 1 om vi fick lånesiffra i föregående operation, dvs. om resultatet blev för stort. Tänk tillbaka på hur man ställer upp addition i grundskolan:

111
----
0011
+1100
----
10001

Siffran ovanför det översta strecket är lånesiffran för varje kolumn. Notera att efter att operationen slutförts har vi fem siffror istället för de fyra vi vill jobba med. När vi har en sådan femte siffra, då blir den lånesiffra.

Därefter kan operationen beskrivas som:
S1 = X xor Y
C1 = X and Y
R = C xor S1
Cout = C and S1

För att sedan bygga en större adderare, 8-bits t ex, sammankopplar vi bara åtta stycken enbitsadderare A1..8, med Cout från A1 till C i A2, och X och Y-ingångarna kopplade till bit 1..8 i de två talen som ska adderas.

Spana också in: