Kezdőoldal » Számítástechnika » Programozás » C++ Double memória címből...

C++ Double memória címből integer szám kiolvasása?

Figyelt kérdés

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:

[link]

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?

[link]

Igazából már órára nem kell ,csak engem akkor is érdekel, köszi szépen előre is :



#memória #C++ #double to int
2016. ápr. 5. 11:07
1 2
 1/14 anonim ***** válasza:

Amit másodikként írtál, az elvileg jó, csak egyrészt tudni kell, hogy az int és a double teljesen másképp van letárolva, másrészt a double 8 bájtos.


Infók:

[link]

[link]

2016. ápr. 5. 11:19
Hasznos számodra ez a válasz?
 2/14 A kérdező kommentje:

Erre jutottam, esetleg van valami szebb és másmilyen megoldás? ez így működik.

[link]

2016. ápr. 5. 12:08
 3/14 A kérdező kommentje:
Bár azt nem értem, hogy a sizeof(a) miért 4 és miért nem 8?
2016. ápr. 5. 12:11
 4/14 anonim ***** válasza:

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ó.

2016. ápr. 5. 12:35
Hasznos számodra ez a válasz?
 5/14 anonim ***** válasza:
Nincs konkrét megkötés a típusok méretére, a double jellemzően 8 byte, de nincs semmi, ami tiltaná, hogy ennél kisebb legyen, észrevételem szerint. Amíg nem kisebb a float típusnál, és nem nagyobb a long double-nél, addig megengedett minden méret számára.
2016. ápr. 5. 12:46
Hasznos számodra ez a válasz?
 6/14 anonim ***** válasza:

Valódi kódban ilyet fogsz látni, amennyiben nem a matematikai szabályok szerint kell kerekíteni.


static_cast<int>(a);

2016. ápr. 5. 12:59
Hasznos számodra ez a válasz?
 7/14 A kérdező kommentje:
Igen, tudom hogy valóban kódban van rá más módszer, csak érdekelt, mert sose próbáltam így át convertálni
2016. ápr. 5. 14:14
 8/14 anonim ***** válasza:

"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"

[link]


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.

2016. ápr. 5. 14:18
Hasznos számodra ez a válasz?
 9/14 anonim ***** válasza:

"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ő.

2016. ápr. 5. 14:20
Hasznos számodra ez a válasz?
 10/14 anonim ***** válasza:

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:

[link]

2016. ápr. 5. 14:56
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!