C++ Double memória címből integer szám kiolvasása?
Sziasztok
Szóval tegnap volt órai munka(?), amire a tanár se jött rá és végül tovább léptünk, de engem érdekel, hogy lehetséges-e. Nos az volt a feladat, hogy doubleból csináljunk integert, ugye a legegyszerűbb talán ez:
Viszont a tanár úgy akarta, hogy memória címből olvassuk ki az integer értékét én valahogy így próbálkoztam(meg még máshogy is, de sehogysem jó, és sosem kapom vissza a 24et), esetleg tudnátok segíteni? vagy valami ötlet?
Igazából már órára nem kell ,csak engem akkor is érdekel, köszi szépen előre is :
Erre jutottam, esetleg van valami szebb és másmilyen megoldás? ez így működik.
A számítógép a lebegőpontos számokat az IEEE 754 szabvány szerint tárolja. A szabvány szerint az egyszeri pontosságú (C-ben float) számot így tárolja:
1 előjelbit
8 bit exponenciális rész
23 bit tizedesrész
Például a (float)50 így lesz tárolva:
0 10000100 10010000000000000000000
A double is hasonló.
Valódi kódban ilyet fogsz látni, amennyiben nem a matematikai szabályok szerint kell kerekíteni.
static_cast<int>(a);
"Bár azt nem értem, hogy a sizeof(a) miért 4 és miért nem 8?"
Mert az "a" egy 32 bites cím (pointer).
A double 64 bites, szabvány szerint.
"double precision floating point type. Usually IEEE-754 64 bit floating point type"
Próbálj long long int-et használni, vagy char típussal mutass rá, és egy 8 elemű tömbként menj végig rajta. (Bár ez egy C-s megközelítés.)
Egyébként a 24-et így sem fogod látni benne. :)
Privire: kérdezz itt nyugodtan, próbálok én is és mások is válaszolni.
"Usually IEEE-754 64 bit floating point type"
Jó, igen, valóban ott a "usually", de meglepődnék, ha nem annyi lenne. Ez nem olyan, mint az int mérete, ami architektúra és fordító függő.
Ez a kódod nem kiolvassa a memóriából az a double típusnak az integer értékét, csak simán átkonvertálja egésszé a double-t, amikor int-é kasztolsz. Ilyen szempontból nincs különbség a két kódod, között, mind a kettő ugyan azt csinálja. Ha valóban ki akarod az egész részt olvasni akkor ismerni kell hogy van tárolva a double, lekérned a kitevőt, és a mantissza részét elshiftelni a kitevővel.
A double 64 bit hosszú, az IEEE 754/1985 szabvány által definiált lebegőpontos szám, amit a ma elterjedt x86-os CPU-kal hajtott számítógépek little endian formában tárolnak.
A lebegőpontos formátum 3 részből áll:
1 bit előjel (S), 11 bit kitevő (E), 52 bit mantissza (M).
Ekkor így lehet kiszámolni az értékét:
(-1)^S * (1.M) * 2^(E-1023)
Más szóval normál alakra van hozva a szám ahol csak számjegyeket és a kettedes-vessző helyét tárolják. (+az előjelet)
Ahhoz hogy kinyerd az egész részt, megnézed hol van a kettedes vessző, és mindent ami előtte van kiírsz.
Ez C-ben valahogy így néz ki:
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!