Pozitivaj kaj negativaj nombroj en komputado

El Vikipedio, la libera enciklopedio

Por fari komputadon kun uzo de pozitivaj kaj negativaj nombroj en komputiloj necesas iel ilin priskribi kaj konservi en registriloj kaj memoro.

En komputiloj ĝenerale estadas uzataj signaj variabloj (kiuj povas teni negativajn kaj nenegativaj nombrojn) kaj sensignaj (kiuj povas teni nur nenegativaj nombrojn).

Variabloj kun flosanta punkto (proksimumigo de reelaj nombroj en komputiloj) ĉiam estas signaj. Entjeraj variabloj povas esti kaj signaj kaj sensignaj.

Inter multaj eblaj manieroj de priskribo de signo du variaĵoj estas kutime (nun) uzataj.

Priskribo kun aparta bito por signo[redakti | redakti fonton]

La unua variaĵo estas per uzo de aparta bito por signo, kaj la restaj bitoj priskribas la modulon de la nombro. Unu el ĉefaj malavantaĝoj de ĉi tiu maniero estas tiu ke nulo povas esti skribata per du diversaj manieroj - +0 kaj -0. Tiam operacio de komparo devas konsideri ĉi tiun okazon kaj redoni rezulton de egaleco se unu el la argumentoj estas +0 kaj la alia -0. Sekve, se memoro de komputilo estas uzata por konservi ion alian, ne nombroj sed ekzemple tekston, ĉi tia operacio de komparo jam ne povas esti uzata, ĉar en maloftaj sed realigeblaj okazoj ĝi ricevos ke du teksteroj estas la samaj, kvankam ili estas diversaj, se unu el teksteroj aspektas kiel +0 kaj la alia aspektas kiel -0.

Nun ĉi tia priskribo kutime estas uzata por nombroj kun flosanta punkto.

Priskribo per aldona kodo[redakti | redakti fonton]

La alia varinto estas per uzo tiel nomata aldona kodo. La ideo estas en tio, ke se oni subtrahas unuon de nulo, la rezulto estos -1, kaj ĉi tion eblas per jam ekzistanta por sensignaj nombroj operacio de subtraho. Do prezento de -1 estas la maksimuma nombro, prezentebla per sensigna nombro kun la sama kvanto de bitoj. Se estas k bitoj en nombro la prezentataj nombroj aspektas tiel:

Kio estas konservata
(duuma)
Sensigna nombro, respektiva
al la prezento
Signa nombro, respektiva
al la prezento
1000...0000 2k-1 -2k-1 Mimimuma signa nombro
1000...0001 2k-1+1 -2k-1+1
1000...0010 2k-1+2 -2k-1+2
... ... ... ...
1111...1101 2k-3 -3
1111...1110 2k-2 -2
1111...1111 2k-1 -1
0000...0000 0 0 Nulo
0000...0001 1 1 Unu
0000...0010 2 2 Du
0000...0011 3 3 Tri
... ... ... ...
0111...1101 2k-1-3 2k-1-3
0111...1110 2k-1-2 2k-1-2
0111...1111 2k-1-1 2k-1-1 Maksimuma signa nombro

Ĉi tiu prezento kutime estas uzata por entjeraj variabloj.

Komputado de aritmetika neo en ĉi tiu okazo estas per la logika neo kaj posta adicio de 1:

-a=~a+1

En ĉi tiu maniero estas priskribeblaj nombroj -2k-1 ... 2k-1-1. En negativo direkto estas je unu nomro pli multe. Se komputi, laŭ donita maniero, aritmetikan neon de ĉi tiu aldona negativa nombro -2k-1, la rezulto estos ĉi tiu nombro mem, do la komputado de aritmetiko neo malsukcesos.

Signon de nomro ĉiam eblas ekscii laŭ la plej valora bito: se ĝi estas 0 la nombro estas nenegativa, se 1 - negativa.

Operacioj de adicio, subtraho kaj bita ŝovo maldekstren estas en ĉi tiu prezento la samaj kiel por sensignaj nombroj.

Operacioj de multipliko, divido, komparo kaj bita ŝovo dekstren estas en ĉi tiu prezento malsamaj ol por sensignaj nombroj. En okazo de komparo temas nur pri alispeca komprenado de la rezultoj, la komparo mem estas fakte subtraho kaj estas farata la same.

Uzo en programlingvoj[redakti | redakti fonton]

Plejparto de programlingvoj ne donas eblecon libere elekti ĉu la variablo estu signa aŭ sensigna. Pri literaj variabloj (por enteni unu literon) la signeco estadas diversa, sed pli ofte ili estas sensignaj. La pli longaj (kun pli granda kvanto de bitoj) variabloj kutime estadas nur signaj.

Inter nemultaj programlingvoj kiuj donas eblecon specifi signecon de entjeraj variabloj estas C kaj C++.

En la lingvoj signa entjera variablo x estas difinata kiel (por diversa kvanto da bitoj):

signed char x;
short x;
int x;
long x;

kaj sensigna entjera variablo x estas difinata kiel:

unsigned char x;
unsigned short x;
unsigned x;
unsigned long x;

Ĉi tie defaŭlta signeco de litera variablo (char) povas estas diversa, por ricevi certan rezulton necesas skribi la deziratan signecon per vortoj "signed" kaj "unsigned". La aliaj variabloj defaŭlte estas signaj, por fari ilin sensignajn vorto "unsigned" estas uzata.