frg Skrevet 21. april 2005 Del Skrevet 21. april 2005 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
Ernie Skrevet 21. april 2005 Del Skrevet 21. april 2005 (endret) Det jeg antar du har fått ut er adressen til a. Edit: rette litt på teksten Endret 21. april 2005 av Ernie. Lenke til kommentar
frg Skrevet 21. april 2005 Forfatter Del Skrevet 21. april 2005 (endret) 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 21. april 2005 av frg Lenke til kommentar
Ernie Skrevet 21. april 2005 Del Skrevet 21. april 2005 Hmmm... i kompilatoren min så får jeg ut 10 jeg... Lenke til kommentar
frg Skrevet 21. april 2005 Forfatter Del Skrevet 21. april 2005 (endret) 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 21. april 2005 av frg Lenke til kommentar
Ernie Skrevet 21. april 2005 Del Skrevet 21. april 2005 Tydligvis blir int'en gjordt om til en 32bit hex-verdi. Tviler på at det er en pen måte å gjøre det på og er garantert ikke standard C++. Lenke til kommentar
frg Skrevet 21. april 2005 Forfatter Del Skrevet 21. april 2005 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
hishadow Skrevet 21. april 2005 Del Skrevet 21. april 2005 (endret) 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 21. april 2005 av hishadow Lenke til kommentar
frg Skrevet 21. april 2005 Forfatter Del Skrevet 21. april 2005 (endret) 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 21. april 2005 av frg Lenke til kommentar
hishadow Skrevet 21. april 2005 Del Skrevet 21. april 2005 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
frg Skrevet 21. april 2005 Forfatter Del Skrevet 21. april 2005 men jeg skjønner fortsatt ikke hvorfor jeg ikke får gjort noe med verdien a i det opprinnlige spørsmålet.... Lenke til kommentar
hishadow Skrevet 21. april 2005 Del Skrevet 21. april 2005 (endret) 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 21. april 2005 av hishadow Lenke til kommentar
frg Skrevet 21. april 2005 Forfatter Del Skrevet 21. april 2005 (endret) ok, da skjønner jeg 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 21. april 2005 av frg Lenke til kommentar
hishadow Skrevet 21. april 2005 Del Skrevet 21. april 2005 ok, da skjønner jeg Men hvorfor blir det 11.000000000000021 og ikke 11.xx......12? Fordi float og double har en egen måte å anvende dataområdet sitt på. Lenke til kommentar
frg Skrevet 21. april 2005 Forfatter Del Skrevet 21. april 2005 Har du noen bøker du kan anbefale på dette området for å sette seg skikkelig inn i det? evt. noen gode nettsteder... Lenke til kommentar
hishadow Skrevet 21. april 2005 Del Skrevet 21. april 2005 (endret) 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 21. april 2005 av hishadow Lenke til kommentar
frg Skrevet 21. april 2005 Forfatter Del Skrevet 21. april 2005 (endret) Takk for god hjelp 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 21. april 2005 av frg Lenke til kommentar
JBlack Skrevet 21. april 2005 Del Skrevet 21. april 2005 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
☀ ❄ Skrevet 21. april 2005 Del Skrevet 21. april 2005 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
frg Skrevet 21. april 2005 Forfatter Del Skrevet 21. april 2005 (endret) 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 21. april 2005 av frg Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå