Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Binäärien yhteenlasku

Burton [21.09.2010 17:20:07]

#

Heippa.

Olin äsken kävelylenkillä ja mieleeni juolahti seuraava probleema. Kuvitellaan, että 8-bittiselle prosessorille syötetään kaksi binäärilukua ja ne lasketaan yhteen:

  11111111
+ 00000001

Mikä on lopputulos? Seuraako overflow?

Metabolix [21.09.2010 17:34:53]

#

Joo, seuraa jonkinlainen overflow. Prosessorista riippuen voisi tapahtua mm. seuraavaa:

  1. Tulokseksi tallennetaan 0, ja lisäksi johonkin muualle tallennetaan 1 merkiksi ylityksestä.
  2. Tulokseksi tallennetaan 0, tietoa ylityksestä ei säilytetä.
  3. Tulokseksi tallennetaan 11111111, koska luku ei voi kasvaa tämän suuremmaksi.

Ainakin x86-prosessoreihin (ja luultavasti aika moniin muihinkin) pätee kohta a: tieto ylityksestä (tai vastaavasti 0, jos ylitystä ei tapahdu) tallennetaan jokaisen laskun jälkeen lippurekisterin (FLAGS) yhteen bittiin (CF, Carry Flag). Tätä tietoa voidaan suoraan käyttää ehdollisissa hyppykäskyissä (JC, Jump If Carry). Lisäksi x86 sisältää käskyn ADC eli Add With Carry, joka laskee yhteen kaksi lukua ja lisää päälle ylityslipun arvon; tällä tavalla voidaan tehokkaasti laskea yhteen pitempiäkin lukuja pala kerrallaan.

Deffi [21.09.2010 17:35:47]

#

Riippuu prosessoriarkkitehtuurista. Luku voi esimerkiksi "pyörähtää" ympäri, jolloin tulokseksi tulee 00000000 ja CF-lippu (carry) asetetaan ykköseksi. Näin ainakin x86:ssa.

Grez [21.09.2010 18:19:57]

#

11111111 voi tarkoittaa myös -1 jolloin 1+(-1) onkin aika luontevasti 0.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta