Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

[Guida] Conversione float<->int (UNION)
(Questo messaggio è stato modificato l'ultima volta il: 10/06/2012, 22:52 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
versione con puntatori->

[Per vedere i link devi REGISTRARTI.]


Ciao a tutti,
miniguida inutile che non servirà a nessuno, tranne che a me quando un giorno mi servirà, non mi ricorderò come cavolo avevo fatto, allora cercherò in internet e uscirà questo mio post su hackmix e ringrazierò di averlo postato Happywide Asd

Forse non tutti lo sanno, ma abitualmente oggigiorno (?) un float è contenuto nello stesso numero di bytes di un un int (anche detto DWORD) ovvero 4 bytes.

Quindi può capitare spesso hackerando, o giocando con CheatEngine o con MHS di trovarsi di fronte a locazioni di memoria che hanno valori tipo questo:

Citazione:42c80000

li per li sembrerebbe uno strano numero senza molto senso, potrebbe anche venire il dubbio che si tratti di un puntatore, ma poi analizzando bene l'uso che ne viene fatto, si scopre che è un float!

Ma quanto cavolo vale quel float in modo piu comprensibile ad un essere umano?

Alcuni programmi hanno dei tools di conversione, beh ve lo dico io, vale

100.0f

Esatto, 100 float.

Beh può capitare a volte che si abbia bisogno da codice di gestire i float come interi o gli interi come float, come facciamo a sapere di che numero parliamo?

Tempo fa avevo usato i puntatori, dichiaro una variabile come puntatore a float, la inizializzo all'indirizzo di una variabile intero ed ecco che quando la dereferenzio ho fatto la conversione, vale anche l'inverso ovviamente.

Oggi però smanettando ho scopero un altro modo forse anche piu pratico, ovvero l'uso dell'UNION
Ebbene si, questo animale sconosciuto che quasi nessuno usa... ecco come fare:

    C++ Programming
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6. union {
  7. int intero;
  8. float flottante;
  9. };
  10.  
  11. flottante = 100.0f;
  12. cout << hex << intero;
  13. }



come funziona? semplice, l'union fa si che la variabile "intero" e "flottante" occupino di fatto lo stesso spazio di memoria, sono la stessa variabile diciamo cosi, però a cui possiamo accedere con 2 nomi diversi e usando 2 tipi diversi.
Cosi nel programma ho inizializzato quella memoria come "float" a 100 e poi l'ho letta come "int" ottenendo il valore visto prima ovvero 42c80000

"hex" serve solo a dire che voglio printare l'output in formato esadecimale

ciao
alla prossima guida inutile Asd

Digger


digger
10/06/2012, 22:45
#1
Cerca

йσѕσиє1 νι ѕσνяαѕтα
Messaggi: 1,085
Discussioni: 108
Registrato: 03-2011
Mix: 0
in poche parole cosa e?

10/06/2012, 23:15
#2
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
quello che ho scritto o.o


digger
10/06/2012, 23:17
#3
Cerca

йσѕσиє1 νι ѕσνяαѕтα
Messaggi: 1,085
Discussioni: 108
Registrato: 03-2011
Mix: 0
non ci ho capito niente
anche se so cosa e una float
e un intero Asd

10/06/2012, 23:21
#4
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
fa niente non è cosi importante, come dicevo servirà a me un domani quando non mi ricorderò piu come ho fatto Tounge


digger
11/06/2012, 0:39
#5
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 11/06/2012, 14:18 da Admin.)

Amministratore
Messaggi: 2,334
Discussioni: 231
Registrato: 03-2011
Mix: 2,570
digger Ha scritto:non mi ricorderò come cavolo avevo fatto, allora cercherò in internet e uscirà questo mio post su hackmix e ringrazierò di averlo postato
ahahahahah
benvenuti nel "mio notepad remoto" lol


[Per vedere i link devi REGISTRARTI.]

Prima di aprire ogni contenuto scaricato su siti esterni ad HackMix, scansionatelo su VirusTotal.
11/06/2012, 14:17
#6
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
magari mi darò anche un +1 Asd


digger
11/06/2012, 16:08
#7
Cerca

Iscritto
Messaggi: 125
Discussioni: 16
Registrato: 04-2011
Mix: 0
Praticamente in memoria viene salvato il dato sia di tipo int che float? Poi quando lo voglio ripescare, se a me serve come int lo prendo da "intero" altrimenti lo prendo da "flottante"?

Ma vengono salvati entrambi, quindi occupano 8 byte, oppure in un unico spazio? Penso sia la prima, giusto?

23/06/2012, 13:06
#8
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
pensi male, è la seconda, ma infatti questo è il vero significato di union, che la STESSA area di memoria (qui 4 bytes) viene condivisa da 2 variabili, di fatto è come se la variabile fosse solo 1 ma puoi accedervi usando 2 nomi.
Quindi di fatto non è esattamente come dici tu che viene salvato SIA l'int che il float, di fatto lui sa che sono 4 bytes, poi come vuoi accedere sono fatti tuoi, puoi accedere come int o come float.
Quello che dici tu è la struct, o la class, in quel caso avresti si 2 variabili separate


digger
23/06/2012, 13:42
#9
Cerca

Iscritto
Messaggi: 125
Discussioni: 16
Registrato: 04-2011
Mix: 0
Ah ecco! Infatti pensavo che UNION e STRUCT dossero in qualche modo uguali... Ma sono simili... Grazie! Smile

23/06/2012, 15:02
#10
Cerca


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  Dubbio float Cyanstack 4 686 20/11/2013, 12:58
Ultimo messaggio: Cyanstack
  [Guida] C/C++ Conversione INT->FLOAT (puntatori) digger 18 3,150 26/07/2011, 13:57
Ultimo messaggio: Skyline@69
  [Guida] Perchè int o float ? digger 3 2,589 27/03/2011, 13:41
Ultimo messaggio: ZioPaperino



Utenti che stanno guardando questa discussione: 1 Ospite(i)