Píosaí liom in áiteanna eile:

2021-04-06

Forlíonadh síne

Ceist: cad is forlíonadh síne ann?
 
Ní hansa. Bíonn méid áirithe giotán in úsáid i ríomhaire do athróg ar bith. Uaireanta bíonn leithéid éagsúla i gceist – 8 ngiotán, 16, 24 nó 32. Nó fiú luachanna idir eatarthu, más ó crua earra ar leith a thagann an luach. Is gnách, mar shampla, gur 12 giotán a bhíonn sa luach a thagann ó tiontaire analógach go digiteach, gléas a úsáidtear go minic chun comhartha a thomhas.
 
Braitheann sé ar an ríomhchláraitheoir ar ndóigh an slánuimhir, uimhir aiceanta, nó cód de chineál éigin atá i gceist le hathróg ar bith. Más slánuimhir atá i gceist, is gnách go mbaintear feidhm as scéim ar a dtugtar comhlánú le dónna. Rinne mé cuir síos ar sin anseo:
 
Abair gur 4 giotán atá i gceist. Mar sin, is féidir na slánuimhreacha idir -8 agus a 7 a chuir i láthair sa chóras dénártha, le comhlánú le dónna mar seo a leanas. (Ciallaíonn 0b gur uimhir dénártha, uimhir ina bhfuil 2 mar bhonnuimhir aige atá i gceist).
 
-8 => 0b1000
-7 => 0b1001
-6 => 0b1010
-5 => 0b1011
-4 => 0b1100
-3 => 0b1101
-2 => 0b1110
-1 => 0b1111
 0 => 0b0000
+1 => 0b0001
+2 => 0b0010
+3 => 0b0011
+4 => 0b0100
+5 => 0b0101
+6 => 0b0110
+7 => 0b0111

Feictear go bhfuil 1 mar an giotán is suntasaí do na huimhreacha faoi náid agus 0 do na huimhreacha os a chionn (agus náid féin). Tugtar an giotán síne ar seo. Má tá athróg le cuir i bhfocal níos leithne, is gá an giotán sin a líonadh isteach. 
 
Mar shampla, chun -8 a athrú ó 4 ghiotán go 8 giotán,
0b1000 => 0b1111_1000
Agus 7:
0b0111 => 0b0000_0111.
 
Sé sin, is gá cóip den ghiotán síne a chuir isteach san giotán bhreise atá a chuir leis an athróg. Forlíonadh síne.
 
Go hiondúil ní gá don ríomhchláraitheoir cúram a dhéanamh de seo – tarlaíonn sé go huathoibríoch. Agus is ansin atá an baol, mar a bhíonn i gcónaí nuair atá an ríomhaire ag iarraidh a bheith cabhrach. (Nó le bheith níos cruinne, dearthóir an chrua earra, an ríomhtheanga nó an tiomsaitheoir).
 
Mar ní féidir talamh slán a dhéanamh de gur slánuimhir atá i gceist! Go minic, is uimhir aiceanta atá i gceist, nó fiú cód seachas uimhir, agus é tábhachtach dá réir gan an forlíonadh síne a dhéanamh.
I gcás an ríomhtheanga C is féidir leis an ríomhchláraitheoir nod áirithe a thabhairt don tiomsaitheoir  tríd cineál athróige “unsigned” – gan sín a úsáid.
 
Go dtí lé déanaí, áfach ní raibh an rogha sin ag an té atá ag úsáid Java. Déanann Java talamh slán de gur slánuimhir – le sín – atá i gceist leis na bun cineáil byte (8 ghiotán), short (16 ghiotán), int (32 ghiotán) agus long (64 ghiotán). (De bhrí go bhfuil Java beag beann ar an ríomhaire, toisc go mbíonn an clár á rith ar ríomhaire fíorúil, tá na huimhreacha giotáin sin mar an gcéanna ar ríomhaire ar bith.
 
Má cuirtear luach as byte i short, déanfar forlíonadh síne.
 
Agus mar sin dé, de réir mar atá na luachanna ag dul i leithéid.
 
Murab é sin atá ón ríomhchláraitheoir, is gá é sin a chuir ina luí ar an inneall Java. Caithfear masc a úsáid.
 
Go hiondúil is le huimhreacha heicsidheachúil a bhím féin ag obair (uimhreacha leis an mbonnuimhir 16. Úsáidtear na litreacha A-F do na digit > 10 )– rud a chuirtear in iúl i mórán teangacha, agus i C agus a gharpháiste Java go háirithe le 0x roimhe.
 
Mar sin, más mian liom athróg atá i short a bhogadh chuig int, gan forlíonadh síne ní mór do obair mar seo a leanas:
 
short a = 0x8000; // uimhir aiceanta, cothrom le 2^15 = 32768
int b = (int) a & 0xFFFF;
 
Cinntíonn sé sin gur 0x0000_8000 an luach a bheidh ag b, seachas 0xFFFF_8000 a bheadh mar thoradh ar forlíonadh síne. Is gá é seo a dhéanamh go minic nuair a bheidh toradh a sháródh leithéid an athróg bunaidh ar obráid air – méadú nó fiú suimiú.
 
Tuigtear dom go bhfuil cineálacha níos “cliste” ag Java anois, gur féidir oibiacht den chineál Integer a chruthú agus cur in iúl gur uimhir aiceanta atá i gceist.
 
Ach má tá duine, mar atáim faoi láthair, ag obair le córas atá scríofa ag daoine eile agus nach bhfuil cúram déanta de cé na luachanna ar gá iad a bheith ina n-uimhreacha aiceanta, nó nach uimhreacha ar chor ar bith iad ach patrúin a bhfuil brí ar leith leo, agus an giotán is suntasaí in úsáid iontu...
... agus sin an fáth go bhfuil an racht seo á scaoileadh agam.
 
Nod libh go bhfuil an téarma “sign extension” curtha faoi bhráid an gCoiste Téarmaíochta agam; agus súil agam go ndéanfar faomhadh ar an leagan “forlíonadh síne” a mhol Kevin Scannell. Braithim go bhfuil “síneadh síne” ciotach.