"Paminu" <asdad@asd.com> writes:
>
> Hvis man kun vil bruge 2 bit er der så en måde at komme denne type overløb i
> forkøbet på? Så vidt jeg har forstået er det kun hvis man addere 2 positive
> tal og resultatet bliver negativt eller hvis man addere 2 negative tal og
> resultatet bliver positivt, at der opstår overløb.
>
> Men jeg kan ikke lige se at mit eksempel opfylder denne definition.
Som udgangspunkt drejer det sig jo om at man lægger tre bit sammen (to
bit plus en mente) fra højre mod venstre og holder styr på menten.
Hvis der er mente på sammenlægningen længst til venstre, er der ikke
noget sted at gøre af den, og den må derfor bortkastes. Flere CPU'er
gemmer en sådan mente i et flag der kan testes på efter
sammenlægningen, men altså væk fra det beregnede resultat.
Ved 2 bit er det mindste heltal der kan repræsenteres 0 (gælder alle),
og det største 2^2-1 (11) altså 3. Ved 8 bit er det største heltal
2^8-1, altså 255.
Ved sammenlægning vil bortkastningen af den sidste mente betyde at 1
og 2^8+1 (257) opfører sig ens for 8-bit tal, og 1 og 2^2+1 (5) opføre
sig ens for 2 bit tal. Der kan lægges vilkårligt mange gange hhv 2^8
og 2^2 til grundtallet og det vil opføre sig ens da menten som sagt
bortkastes. Faktisk vil de forskellige repræsentationer være
uskelnelige på bitniveau.
Tilsvarende kan man også trække et vilkårligt antal hhv 2^8 og 2^2
fra, og få identisk opførsel. Man har derfor bemærket at man kan
vælge at opfatte talrækken 0 til 255 (nu bruger jeg 2^8 for resten)
anderledes.
Man gør nemlig det at man siger at man har brug for både negative og
positive tal, og så er det meget praktisk at dele så nul ligger i
midten, fordi så kan man nemlig lægge skillelinien så alle de negative
tal har 1 i bitten til venstre og alle de positive har 0 i bitten til
venstre.
Det betyder så at for 2^8 vil det største positive tal være 0111 1111
eller 127, og det mindste negative være 1000 0000 eller -128 som før
ville have været 128.
Vi kan igen lægge dem sammen.
0111 1111
+ 1000 0000
-----------
1111 1111
hvilket passer for både 127 + (-128) = -1 og 127 + 128 = 255.
Det drejer sig altså om hvordan bitmønstrene fortolkes. For plus og
minus er der ingen forskel.
For at skifte til dit eksempel med 2 bit og 1 og -2, så er
1 = 01
-2 = 10
som du selv bemærker så er -(-2) = 2 som også er 10. Dem kan du så
lægge sammen.
01
10
--
11
og det er 3. Da du kører fra -2..1 er det det samme som -1.
Min oprindelige bemærkning om der var overløb, var derfor lige hurtig
nok. Der beklages.
Er det lidt klarere nu?
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/