dcomnet-nr. 6 Talrepræsentation Computere og Netværk (dcomnet) Efterår 2009
1 Talrepræsentation På maskinkodeniveau (Instruction Set Architecture Level) repræsenteres ordrer og operander ved bitfølger af forskellig længde. F.eks. repræsenteres IJVM ordren: iload 25 som bitfølgen 0001010100011001, altså 16 bit; de første 8 bit er koden (opcode) for iload, de sidste 8 bit er operanden 25 repræsenteret som et binært tal, SCO, appendix A. I ordren: bipush -2 bliver tallet -2 repræsenteret som bitfølgen 11111110, altså bruges igen 8 bit til at repræsenterer operandværdien -2. IJVM repræsenterer negative tal ved såkaldt 2-komplement repræsentation, SCO, appendix A. Det er denne repræsentation af -2 som giver de 8 bit. I ordren: invokevirtual 14 repræsenteres 14 som et binært tal med 16 bit i to byte med de mest betydende 8 bit i den laveste adresse, SCO, s. 72, big endian. De 16 bit er fordelt på to byte således: Udregner vi: adresse i : 00000000 adresse i+1: 00001110 bipush 0 bipush 5 isub vil toppen af stakken efter udførelse af den sidste ordre indeholde værdien -5 repræsenteret som en bitfølge 11111111111111111111111111111011, med 32 bit; det negative tal -5 repræsenteres også her ved 2-komplement repræsentation. Vi skal i det følgende se nærmere på talrepæsentation ved hjælp af bitfølger. Lad os starte med at indskrænke os til i en given situation at betragte bitfølger af en fast længde N 1. En bitfølge med længde N kaldes i det følgende et bitmønster og et vilkårligt bitmønster skrives således: W = w N 1 w N 2 w 1 w 0 hvor w i {0, 1} og de enkelte bitpositioner fra venstre mod højre nummereres som position N 1, N 2,..., 0. Mængden af bitmønstre med N bit betegnes B N. Der er 2 N elementer i B N. I repræsentationen af ordren iload 25 er de sidste 8 bit altså et element i B 8. I invokevirtual 14 er de sidste 16 bit et element i B 16, mens indholdet på toppen af stakken er et element i B 32. 1
Når elementerne i B 8 som operand til iload, fortolkes som tal, sker det ved at fortolke de enkelte bit som cifre i det binære talsystem med de mindst betydende til højre og de mest betydende til venstre. F.eks.: 25 = 1 2 4 + 1 2 3 + 1 2 0 Generelt for W B N fås tallet ud fra bitmønstret på følgende vis: W = N 1 w i 2 i hvor altså er en afbildning af bitmønstre ind i de ikke-negative heltal (Unsigned Integer), dvs. B N UI. Mere præcist er billedmængden for denne afbildning en delmængde af de ikke-negative heltal nemlig UI N = {0, 1, 2,, 2 N 1}. De 8 bit i varnum i ordren iload skal altså fortolkes som et ikke-negativt heltal i {0, 1,, 2 8 1 = 255} og i ordren invokevirtual er området for operanden, et index i Constant Pool, {0, 1,, 2 16 1 = 65535}. Afbildningen giver altså bitmønstre en fortolkning som et ikke-negativt heltal. Den omvendte afbildning 1 fra f.eks. {0, 1,, 255} B 8 er en repræsentation af ikke-negative heltal som bitmønstre. Begge afbildninger og 1 er illustreret i SCO, figur A-5 og A-6. Operanden til bipush er bitmønstret 11111110. Dette er jo et element i B 8. Betragtes dette som et ikke-negativt heltal fås: 11111110 = 254 altså må bitmønstret skulle fortolkes anderledes, når vi tillægger det værdien -2. Det sker ved såkaldt 2-komplement fortolkning : eller generelt: W 2 = 11111110 2 = 2 { W når W 2 N 1 1 W 2 N når W 2 N 1 Da 2 8 = 256 fås netop fortolkning -2 for bitmønstret ovenfor. Afbildningen 2 : B N I, af bitmønstre ind i de hele tal (Integer), fortolker bitmønstre anderledes end afbildningen. Billedmængden er I N = { 2 N 1,, 2 N 1 1}; et interval af heltal som er næsten symmetrisk om 0. Denne fortolkning kaldes som nævnt 2-komplement fortolkning og den omvendte afbildning kaldes 2- komplement repræsentation. Denne repræsentation gør det således muligt at repræsentere både negative og positive heltal ved hjælp af bitmønstre. Det er netop 2-komplement fortolkningen af bitmønstre i B 32 som benyttes, når stakelementer indgår i en beregning som f.eks. ovenfor. Da alle bitmønstre med W 2 N 1 1 har w N 1 = 0, mens bitmønstre med W 2 N 1 har w N 1 = 1, kan vi alene ud fra w N 1 se om et tal er ikke-negativt eller negativt ved 2-komplement repræsentationen. Altså kan 2 også defineres således: eller W 2 = { W når wn 1 = 0 W 2 N når w N 1 = 1 W 2 = W w N 1 2 N 2
Dette benyttes i IJVM ordren iflt. I SCO, figur 4-11, er iflt defineret som: Pop word from stack and branch if it is less than 0 På maskinkodeniveau betyder relationen stack word < 0 altså, at de 32 bit på toppen af stakken fortolket som en 2-komplement værdi skal være negativ, dvs. bit 31 i bitmønstret på staktoppen skal være 1. Af denne grund kaldes bit 31 eller generelt bit N 1 i et 2-komplement fortolket bitmønster for en fortegnsbit. 1.1 Bitkomplement At komme fra -27 til et element i B 16 som ved 2-komplement repræsentation repræsenterer værdien -27 kan selvfølgelig ske ud fra definitionen: 27 = U 2 16 U = 2 16 27 = 65509 og så finde de 16 bit i U ud fra dette. Det kan være lidt besværligt, især for små negative heltal, at finde U på denne måde. I stedet kan man gøre følgende, se SCO, s. 685, start med den numeriske værdi af tallet: 27 = 0000000000011011 = W Så fås U ved at danne bitkomplement eller bitvis negationen af W, kaldet W, læg 1 til og smid en eventuel mente væk: W = 1111111111100100 + 0000000000000001 U = 1111111111100101 For at indse at denne metode gælder i almindelighed skal vi starte med en simpel relation imellem ikke-negativ heltalsfortolkning af et bitmønster W og dets bitkomplement W : Denne opnås simpelt således: W + W = 2 N 1 W + W = N 1 w i 2 i + N 1 (1 w i) 2 i Relationen omskrives til: = N 1 2 i = 2 N 1 W = W + 1 2 N Antages W > 0, optræder der ingen mente ved den binære addition af W og 1. Skrives resultatet af denne binære addition som bitmønstret betegnet med W + 1 fås: W = W + 1 2 N = U 2 N og dette viser netop at bitmønstret U = W + 1 repræsenterer tallet W, når W > 0. 3
1.2 Fortegnsforlængelse Når konstanten i bipush -2 anbringes på toppen af stakken skal bitmønstret i B 8 udvides til 32 bit, altså et element i B 32. Udvidelsen skulle jo gerne ske så elementet i B 32 stadig bliver fortolket som værdien -2. Det sker ved fortegnsudvidelse (sign extension, SCO, s. 238). Antag, W B N og at W skal udvides til et bitmønster i B N+M. Det sker således: { 0 0 W når wn 1 = 0 signextend(w ) = 1 1 W når w N 1 = 1 Fortegnsbit w N 1 i W kopieres til de M mest betydende positioner i det udvidede bitmønster. At dette giver samme 2-komplement fortolkning som det oprindelige bitmønster, kan indses således. Vi har trivielt: Det andet tilfælde giver følgende: 0 0 W 2 = 0 0 W = W = W 2 1 1 W 2 = 1 1 W 2 N+M = N+M 1 i=n 1 2 i + W 2 N+M = 2 N M 1 2 i + W 2 N+M = 2 N (2 M 1) + W 2 N+M = W 2 N = W 2 Så i begge tilfælde fås samme 2-komplement fortolkning. 4
Opgaver Opgave 1.1 Angiv for B 4 og B 8 billedmængden for afbildningen. Vis, at w k = ( W div 2 k )mod 2 Hvordan stemmer dette med metoden i SCO, ap- for k = 0, 1,, N 1. pendix A, figur A-5? Opgave 1.2 Skriv 1, 7 og 27 som elementer i B 6 ved 2-komplement repræsentation. Hvad er værdimængden for afbildningen 2 : B 6 I? Opgave 1.3 Fortolk følgende elementer i B 8 som 2-komplement heltal: 11100011 01111111 11111111 10000000 Opgave 1.4 Ved 8 bit 2-komplement repræsentation af heltal kan man komme fra et konkret bitmønster til den repræsenterede værdi ved at give den mest betydende bit vægten 128; de øvrige bit indgår med sædvanlig vægt. Haves f.eks. 11100010 fås den repræsenterede værdi som 128 1+1 64+1 32+1 2 = 30. Hvorfor det? 5