Veseli skaitļi datora atmiņā

Heksadecimālā (hexadecimal) sistēma

Jebkurš vesels skaitlis n > 1 var būt skaitīšanas sistēmas bāze, bet datorzinātnēs parasti pietiek ar bāzēm n=10, n=2, n=16). Pirmo 16 veselo nenegatīvo skaitļu bināros un heksadecimālos pierakstus vēlams zināt no galvas.

DecimālāBinārāHeksadecimālā
000000
100011
200102
300113
401004
501015
601106
701117
810008
910019
101010a
111011b
121100c
131101d
141110e
151111f

Katrs cipars "1" binārajā pierakstā apzīmē kādu skaitlī ietilpstošu divnieka pakāpi, un katrs "0" attēlo attiecīgās divnieka pakāpes trūkumu. No skaitļa binārā pieraksta tātad Jūs varat noskaidrot, kuras divnieka pakāpes jāsaskaita, lai to dabūtu. Piemēram, binārajā sistēmā pierakstīts skaitlis "10000101" ir decimālajā sistēmā izsakāms ar izteiksmi:

1*128 + 0*64 + 0*32 + 0*16 + 0*8 + 1*4 + 0*2 + 1*1 = 133

Binārais pieraksts ir īpaši svarīgs datoru arhitektūrā, jo daudzi elektroniskās atmiņas elementi var atrasties divos stāvokļos - "ieslēgts" un "izslēgts". Ja ir pavisam 8 slēdži un katrs var atrasties 2 stāvokļos, tad pavisam var aprakstīt 2sup8/sup=256 dažādus skaitļus. Tie ir skaitļi 0,1,...,255. Šis ir viens no iemesliem, kāpēc valodā Java (un arī JavaScript, PHP un C) sarakstu elementus ir ērti numurēt no 0, nevis no 1.

Parasti atmiņas elementus grupē pa 8, ko sauc par baitu. Katru baitu datorā uzskata par patstāvīgu atmiņas vienību, kuru var neatkarīgi no citām lasīt, rakstīt, norādīt, utt. Jāņem vērā, ka jēdziens "baits" īpašās situācijās var nozīmēt arī citu atmiņas apjomu, ja mašīnā kāds cits bitu skaits tiek uzskatīts par patstāvīgu atmiņas vienību. Piemēram, vienā ASCII kodējuma baitā informācijas daudzums ir 7 biti. Logjiski pieejamo bitu skaits baitā var nesakrist ar to, kas iebūvēts mašīnas dzelžos, jo dažus bitus mēdz izmantot kļūdu labošanai, utml.

Heksadecimālo pierakstu var uzskatīt kā saīsinājumu pierakstam divnieku skaitīšanas sistēmā, tādējādi "7C1" ir divnieku pieraksta 0111_1100_0001 ērtaks ekvivalents. Heksadecimālajā sistēmā bieži pieraksta datora atmiņas saturu pa baitiem. Katrs baits aizņem 8 bitus vai arī 2 heksadecimālos ciparus.

Atmiņas mērīšana

1 kilobaits (<em>kilobyte</em>) (1k) = 1024 baiti
1 megabaits (<em>Megabyte</em>) (1Mb) = 1024 kilobaiti
1 gigabaits (<em>Gigabyte</em>) (1Gb) = 1024 megabaiti
1 terabaits (<em>Terabyte</em>) (1Tb) = 1024 gigabaiti

Datora operatīvās atmiņas (RAM - Random Access Memory) apjoms parasti ir kāda divnieka pakāpe. Tipiskam personālajam datoram šī atmiņa ir robežās starp 256 megabaitiem un 2 gigabaitiem.

Papildkods (Twos Complement)

Atmiņas reģistrs vesela skaitļa glabāšanai parasti ir 1, 2, 4 vai 8 baitus liels (tam atbilst Javas datu tipi byte, short, int un long). Tam jāvar glabāt gan pozitīvi, gan negatīvi skaitļi.

Papildkodā pozitīvos skaitļus attēlo, izmantojot to parasto bināro reprezentāciju, bet prasot, lai pirmais (visvecākais) bits būtu nulle. Negatīvos skaitļus glabā īpašā veidā, kas iegūts pārveidojot tiem atbilstošos pozitīvos skaitļus. Negatīvā skaitļa papildkodu iegūst, izveidojot pozitīvā skaitļa papildinājumu (visu "0" vietā rakstot "1" un otrādi), un pēc tam rezultātam pieskaitot vieninieku. Veicamo soļu apraksts ar piemēru:

  1. Noskaidrojam papildkodā rakstāmā skaitļa zīmi. Ja tas ir pozitīvs, tad papildkods ir vienkārši tā binārais pieraksts (sk. algoritmu decimālu skaitļu pārveidošanai binārā formā). Piemēram, -113 &lt; 0
  2. Negatīviem skaitļiem, pārveidojam šim skaitlim pretējo pozitīvo skaitli binārā formā. Piemēram, "113" bināri pierakstāms kā "01110001".
  3. Izveido binārā pieraksta papildinājumu, t.i. pārrakstām visas "0" par "1" un visus "1" par "0". Piemēram, "01110001" pārtop par "10001110".
  4. Pieskaitām vieninieku rezultātam, lai iegūtu papildkodu. T.i. "-113" papildkods ir "10001111". ~

Negatīvo skaitļu pārveidošana atpakaļ no papildkoda uz decimālo pierakstu arī iet cauri šīm pašām darbībām - vispirms pārmainām visus bitus uz pretējo, pēc tam pieskaitām 1 rezultātam un visbeidzot pārveidojam rezultātu no binārās formas uz decimālo. Piemērs:

  1. Noskaidrojam papildkodā pierakstītā skaitļa zīmi (vai vecākais bits ir "0" vai "1"). Ja skaitlis ir pozitīvs (zīmes bits ir "0"), tad pārveidojam bināro skaitli decimālā formā. Piemēram, varam secināt, ka "11100101" ir negatīva skaitļa papildkods, jo pirmais bits ir "1" (nevis "0").
  2. Izveidojam papildinājumu, t.i. pārrakstām visas "0" par "1" un visus "1" par "0". Piemēram, pārveidojam "11100101" par starprezultātu "00011010".
  3. Pieskaitām vieninieku rezultātam. T.i. iegūstam "00011011".
  4. Pārveidojam šo skaitli decimālā formā un pieliekam "-" zīmi.

Papildkoda rēķināšanā ir divi speciāli gadījumi. Ja gribam atrast papildkodu skaitlim "-0", tad iznāk pieskaitīt "1" skaitlim "11111111", kas noved pie reģistra pārplūšanas (pārnesumā rodas cipars "1", kuru nav kur likt) un rezultāts sanāk tāpat "00000000", t.i. -0=0.

Ja gribam pārveidot papildkodu "10000000" decimālajā sistēmā, tad ievērojam, ka tas ir negatīvs (pirmais cipars ir "1"), t.i. rēķinām papildinājumu, kas ir "01111111" un pieskaitām tam "1". Iegūstam atkal "10000000". Šoreiz tas jāuztver kā binārs pieraksts pozitīvam skaitlim 128. Tātad "10000000" papildkodā vienāds ar negatīvu skaitli "-128". No šejienes var secināt, ka papildkoda "01111111" vienāds ar decimālo "127" ir lielākais, bet papildkoda "10000000" jeb decimālais "-128" ir mazākais skaitlis, kuru var pierakstīt 8 bitu papildkodā.

Vispārīgi: ja dots n-bitu papildkods, tad ar to var pierakstīt skaitļus no -2 pakāpē "n-1" līdz 2 pakāpē "n-1" mīnus viens.

Bibliogrāfija