Conas is féidir leat an difríocht idir ASCII i ndénártha agus an deachúil chéanna sa dénártha a insint?


freagra 1:

Go ginearálta, ní féidir leat, ní amháin trí na giotáin. Mar shampla, an uimhir 00111001 i bhfoirm dhénártha: D’fhéadfadh gurb í an uimhir 57 í, ach d’fhéadfadh gurb í an uimhir ASCII "9" í freisin.

Go praiticiúil, áfach, is minic a fheiceann tú an difríocht. Toisc go bhfuil tuairim agat faoin luach ar cheart duit a bheith ag obair leis. Smaoinigh ar an bhfeidhm C seo a leanas, ina bhfuil earráid shoiléir:

cló int (int n) {char buf [1]; int i; i = 3 * n + 2; sprintf (buf, "% i \ n", i); tacair (buf); filleadh i; }}

Ríomhann sé an luach 3 * n + 2 do gach slánuimhir n, déanann sé an luach seo a aschur chuig an consól agus tugann sé an luach ar ais mar shlánuimhir. Mar sin féin, agus an ghné seo á thástáil, b’fhéidir go bhfaighidh tú amach má iontrálann tú 9, mar shampla, go ndéanfar an toradh ceart 29 a phriontáil ar an consól. Tugtar an luach mícheart ar ais, áfach, sa chás seo luach 57. Agus is féidir leis sin léargas a thabhairt duit ar a bhfuil ag tarlú anseo, ós rud é go bhfaighidh tú amach gurb é 57 an léiriú ASCII ar uimhir 9 agus tarlaíonn sé gurb é seo an dhigit deireanach den toradh.

Ansin déanann tú turgnamh agus aimsíonn tú go bhfuil sé seo fíor aon uair is uimhir dhá dhigit an toradh. Mar shampla, le n = 5, ba cheart go mbeadh 17 mar thoradh air, ach ina ionad sin is é 55 an toradh, léiriú ASCII den uimhir "7".

Agus má tá níos mó ná 2 dhigit sa toradh, is strainséir an toradh fiú. Mar shampla, le n = 50, is é an toradh ceart 152 aschur ar an gconsól, ach is é an luach toraidh 12853 in uimhir deachúil nó 0x3235 san uimhir heicsidheachúlach. B’fhéidir go bhfaighidh tú amach gurb é seo léiriú ASCII ar an tsreang “25” nó an dá dhigit dheireanacha den toradh in ord droim ar ais!

Mar sin, cad atá ar siúl anseo? Tabhair faoi deara nach dtugann an maolán carachtar ach spás do charachtar aonair! Ní dhéanann an fheidhm sprintf () i C seiceáil ar ró-shreafaí maolánacha, mar sin is maith léi a aschur a scríobh chuig an gcuimhne a dtugann buf aird air, agus déanann sé na bearta a fhorscríobh díreach tar éis na bearta atá curtha in áirithe do bhuf má tá an buf ró-bheag. Sa chás seo, is iad seo na bearta atá curtha in áirithe don slánuimhir i agus tá siad frithscríofa. Agus ós rud é go n-úsáidtear luach i ansin mar luach toraidh na feidhme seo, tá an luach toraidh mícheart.

Níl ach ceist amháin fós ann: cén fáth go bhfuil na digití ASCII deireanacha den toradh sa luach toraidh, ach in ord droim ar ais? Tá sé seo toisc (ag glacadh leis go bhfuil tú ag obair ar ríomhaire) go ndéantar bearta slánuimhir a stóráil "an bealach mícheart". Mar shampla, stóráiltear an slánuimhir 32-giotán 0x12345678 sa chuimhne mar bheart 0x78 0x56 0x34 0x12.

Mar sin más é n = 50 an t-ionchur, stóráiltear an chéad dhigit den toradh i mbuf, agus críochnaíonn an dara agus an tríú dhigit den toradh in i, a dhéantar ina bhearta 0x35 0x32 0x00 0x00 ansin. Agus léiríonn sé seo an luach 0x3235 = 12853 i deachúil má léirítear é mar uimhir 32-giotán.

Mar nóta deiridh, má dhéanann tú iarracht é seo ar do ríomhaire i ndáiríre, d’fhéadfadh go mbeadh na torthaí éagsúil, toisc go mbraitheann éifeachtaí na gcineálacha earráidí seo go mór ar an taobh istigh de do ríomhaire agus ar do thiomsaitheoir. Mar shampla, de ghnáth stórálann fón cliste a bhearta san ord ceart ionas go bhfaighidh tú uimhir dhifriúil. Agus féadfaidh do thiomsaitheoir níos mó ná 1 bheart a chur in áirithe do bhuf mar gheall ar fhadhbanna ailínithe cuimhne, nó buf a stóráil agus a mhalairt (i mo chuimhne ar dtús, ansin buf). Nó féadann sé an leas is fearr a bhaint as ach an toradh a stóráil i gclár LAP. Sa chás seo, tá an toradh ceart, ach déantar damáiste do rud éigin eile sa chuimhne.

Má tá earráidí den sórt sin i gcláir, beidh gach geall bunaithe ar an méid a tharlóidh i ndáiríre.


freagra 2:

Más é 48 léiriú ASCII ar an uimhir nialas agus gurb é 57 léiriú ASCII ar uimhir a naoi, is é an nibble is lú suntasaí an líon a léirítear i ndáiríre:

0000 0000-0011 0000 = 32 + 16 + 0 = 48

0000 0001-0011 0001

0000 0010-0011 0010

0000 0011-0011 0011

0000 0100-0011 0100

0000 0101-0011 0101

0000 0110-0011 0110

0000 0111-0011 0111

0000 1000-0011 1000

0000 1001-0011 1001 = 32 + 16 + 8 + 1 = 57

nó simplí; dealaigh 48 chun an uimhir a fháil.