Gå til innhold

spørsmål om casting...


Anbefalte innlegg

hvis jeg skriver følgende:

 

int a = 10;

 

cout << (int *) a;

 

så får jeg: 0000000A, altså hex-verdien til 10. Er det slik at hvis man caster med (int *) så får man ut hex-verdien? Eller har det noe med hvordan cout er definert?

Lenke til kommentar
Videoannonse
Annonse

det da ikke adressen til a hvis jeg endrer veriden på a til 11 så får jeg utskriften 0000000B.... Adressen til a(&a) er 0012FF78 når verdien er både 10 og 11.

Endret av frg
Lenke til kommentar

så det er kompilator avhengig..... bruker visual 6.0...

 

Vet du egentlig hva som skjer når man kaster en variabel til (int *)?

 

Edit: har nå testet det i Builder 6 og da får utskriften 10 og 11....

Endret av frg
Lenke til kommentar

En annen ting, hvis jeg gjør dette:

 

double a = 11;

 

int *pkr;

pkr = (int *)&a;

 

*pkr = 12;

int c = *pkr;

cout << pkr << " " << &a << " " << c << " " << a << endl;

 

så skriver det ut adressen til a to ganger + at c skriver ut 12 og a bare skriver ut 11. Hvordan har det seg at *pkr(som i burde være innholdet til a, altså 11) holder på verdien 12 uten at a endrer seg? Burde det ikke evt. blitt en kompileringsfeil siden jeg prøver å sette en double med en int?

Lenke til kommentar
En annen ting, hvis jeg gjør dette:

...

double a = 11 (8 bytes)

pkr = (int *)&a (4 bytes, mister 4 bytes)

*pkr = 12; (a = 11.000000000000021)

int c = *pkr; (4 bytes, mister 4 bytes)

cout ... (avrunder a, så 11)

 

edit:fix

Endret av hishadow
Lenke til kommentar

bortsett fra at c skriver ut 12....

 

Det er jo generellt ikke noe problem å kaste fra en double til int så lenge double inneholder et heltallt. f.eks:

 

double a = 1000;

int b = (int) a; //begge får da verdien 1000.

Strengt tallt unødvendig å bruke (int)a, men det var bare et eksempel.

Endret av frg
Lenke til kommentar
double a = 1000;

int b = (int) a; //begge får da verdien 1000.

Strengt tallt unødvendig å bruke (int)a, men det var bare et eksempel.

En god kompilator vil gi warning hvis ikke casting er med, fordi du prøver å gjøre en tilordning med to komplett ulike typer.

Lenke til kommentar
men jeg skjønner fortsatt ikke hvorfor jeg ikke får gjort noe med verdien a i det opprinnlige spørsmålet....

Den blir jo endret. Verdien blir 11.000000000000021 etter at du har behandlet 4 bytes (i form av en int) av den 8 bytes dataområdet til double verdien. Cout avrunder nok resultatet, så det ser ut som du ikke har endret noe.

Endret av hishadow
Lenke til kommentar

ok, da skjønner jeg :roll:

Men hvorfor blir det 11.000000000000021 og ikke 11.xx......12?

 

Og hvorfor får c verdien 12 og ikke 11?

 

hvis jeg har c som en double istedet for en int så får den fortsatt verdien 12.

Endret av frg
Lenke til kommentar
Har du noen bøker du kan anbefale på dette området for å sette seg skikkelig inn i det? evt. noen gode nettsteder...

Hvis Bjarne skriver rett, så er oppbygningen av float og double avhengig av kompilator. Så ikke rot i disse, hvis du da ikke vil implementere en algoritme om gjøre dem om til en tekststreng.

 

http://msdn.microsoft.com/library/default....t_Languages.asp

 

http://www.mathworks.com/company/newslette...Fall96Cleve.pdf

 

 

 

(har aldri tenkt noe særlig over dette :) )

 

ed:

http://en.wikipedia.org/wiki/IEEE_floating-point_standard

 

http://babbage.cs.qc.edu/courses/cs341/IEEE-754hex32.html

http://babbage.cs.qc.edu/courses/cs341/IEEE-754hex64.html

Endret av hishadow
Lenke til kommentar

Takk for god hjelp :thumbup:

 

Edit: hehe... en liten ting til. Samme(nesten) kode på nytt:

 

double a = 11;

 

int *pkr;

pkr = (int *)&a;

 

 

cout << a << " " << *pkr << endl;

 

Her skrives *pkr ut som 0,

 

Vil det si at pkr bare får ut "int" delen av a(11.000000000000000), altså 4 byte(tilsynelatende de siste)?

Endret av frg
Lenke til kommentar
hvis jeg skriver følgende:

 

int a = 10;

 

cout << (int *) a;

 

så får jeg: 0000000A, altså hex-verdien til 10. Er det slik at hvis man caster med (int *) så får man ut hex-verdien? Eller har det noe med hvordan cout er definert?

Kan ikke se at det er gitt noe klart svar på dette.

 

Det som skjer er at a castes til en adresse, og skrives ut som adressen 10 (hex: A). Nøyaktig hvordan en adresse skrives ut, kan variere fra plattform til plattform. Og om jeg gjetter villt, så er det også konfigurertbart...

Lenke til kommentar
En god kompilator vil gi warning hvis ikke casting er med, fordi du prøver å gjøre en tilordning  med to komplett ulike typer.

Alle de innebygde typene (bool, char, int, double med deres signed, unsigned, short og long slektninger) kan konverteres implisitt til hverandre. En god kompilator gir dermed ikke en advarsel før det er snakk om implisitt typekonvertering som tar bort informasjon (slik som double til int i dette tilfellet).

Lenke til kommentar
hvis jeg skriver følgende:

 

int a = 10;

 

cout << (int *) a;

 

så får jeg: 0000000A, altså hex-verdien til 10. Er det slik at hvis man caster med (int *) så får man ut hex-verdien? Eller har det noe med hvordan cout er definert?

Kan ikke se at det er gitt noe klart svar på dette.

 

Det som skjer er at a castes til en adresse, og skrives ut som adressen 10 (hex: A). Nøyaktig hvordan en adresse skrives ut, kan variere fra plattform til plattform. Og om jeg gjetter villt, så er det også konfigurertbart...

igjen(kanskje jeg er helt på jordet... men det tror jeg ikke....), den utskriften gir ingen adresse. Den gir verdien til variabelen. Det er bare å sjekke(har nevnt det ovenfor også.....). Hvis jeg endrer verdien til f.eks 20, så skriver den ut 14 i hex(visual 6.0) og 20 desimaltall(borland b.6).

 

Hvis dette hadde vært en adresse så burde den ha vært konstant selv om jeg endret verdien på variabelen. Eller? En variabel endrer da ikke adresse bare for de jeg endrer verdien fra f.eks 10 - 20? Dessuten så er adressen(i hex) til a: 0012FF78

Endret av frg
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...