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

[Guida] C/C++ Conversione INT->FLOAT (puntatori)
(Questo messaggio è stato modificato l'ultima volta il: 10/06/2012, 22:51 da digger.)

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

[Per vedere i link devi REGISTRARTI.]


Ciao!
nel cercare di hackerare qualche gioco usando un debugger, ad esempio Olly può capitare di imbattersi in cose come questa:

MOV EAX,42C80000

Ma che razza di numero è quello?
Se lo convertiamo con la calcolatrice da hex a decimale otteniamo : 1120403456

Torna la domanda... ma che razza di numero è? e cosa se ne fa il gioco di un numero cosi?

La risposta è semplice, NON è un numero decimale, è un FLOAT!

Già, perchè il numero float occupa 4 bytes, quindi può essere usato tranquillamente come qualsiasi numero decimale DWORD caricandolo nei soliti registri (basta usarlo nella maniera giusta).

Ma se volessimo convertire quel numero e capire quanto vale in float?
Ci sono dei programmini che lo fanno, ma visto che siamo nel topic del C/C++ vediamo come farlo con un programmino.

Prima vediamo quello che farebbe "intuitivamente" un programmatore con poca esperienza (ci ono cascato pure io eheh )

    C++ Programming
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6. int i= 0x42C80000;
  7. float f = (float)i;
  8.  
  9. printf("%f",f);
  10. system("pause");
  11. }



Ovvero dichiariamo la variabile i come intero (decimale) e la inizializziamo a quel valore, poi gli diciamo che la vogliamo float usando un "cast" che la cambia di tipo.
Peccato che il risultato non è quello che vogliamo, infatti il risultato è questo:

1120403456.000000

Che del resto ha senso, è la stessa cosa che succede quando con la calcolatrice convertiamo quel numero da esadecimale a decimale.

Ma ora vediamo qual è il sistema giusto per vedere in float quanto vale quel numero:

    C++ Programming
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6. int i= 0x42C80000;
  7. float *f = (float*)&i;
  8.  
  9. printf("%f",*f);
  10. system("pause");
  11. }



Qui abbiamo usato i puntatori.
Dichiariamo la variabile i come integer come prima e lo inizializziamo.
Questa volta però f lo diciariamo come PUNTATORE AD UN FLOAT, e non come float.
E a cosa lo inizializziamo? Essendo un puntatore, dobbiamo dargli un indirizzo quindi usiamo la sintassi:

&i;

che vuol dire "indirizzo di i"

Però siccome i è un integer, la forma &i ci darà un puntatore ad integer, quindi anche stavolta usiamo il casting, e scriviamo (float*) che vuol dire "convertilo in puntatore a float)

Ci resta solo un ultimo accorgimento, nel stampare a video il valore.
Infatti non possiamo stampare il VALORE di f! perchè è un PUNTATORE e non un float.
Allora dobbiamo stampare IL VALORE PUNTATO DA F e per farlo si fa cosi:

printf("%f",*f);

Notate il

*f

che appunto vuol dire "il valore puntato da f"

Il risultato è questo:

100.000000

Che è esattamente quello che ci serviva,
0x42C80000 int = 100.0 float


alla prossima
ciao
Digger


digger
25/07/2011, 11:41
#1
Cerca


Messaggi in questa discussione
C/C++ Conversione INT->FLOAT (puntatori) - da digger - 25/07/2011, 11:41
[Nessun oggetto] - da Skyline@69 - 25/07/2011, 13:45
[Nessun oggetto] - da digger - 25/07/2011, 14:47
[Nessun oggetto] - da Skyline@69 - 25/07/2011, 17:54
[Nessun oggetto] - da Luxor - 25/07/2011, 18:01
[Nessun oggetto] - da digger - 25/07/2011, 18:10
[Nessun oggetto] - da Skyline@69 - 25/07/2011, 21:13
[Nessun oggetto] - da Luxor - 25/07/2011, 21:37
[Nessun oggetto] - da Luxor - 25/07/2011, 20:36
[Nessun oggetto] - da digger - 25/07/2011, 22:08
[Nessun oggetto] - da Skyline@69 - 25/07/2011, 22:30
[Nessun oggetto] - da Luxor - 25/07/2011, 22:34
[Nessun oggetto] - da Skyline@69 - 25/07/2011, 22:34
[Nessun oggetto] - da Patoffo - 25/07/2011, 22:35
[Nessun oggetto] - da Luxor - 25/07/2011, 22:40
[Nessun oggetto] - da digger - 25/07/2011, 23:31
[Nessun oggetto] - da Skyline@69 - 26/07/2011, 7:05
[Nessun oggetto] - da Luxor - 26/07/2011, 12:36
[Nessun oggetto] - da Skyline@69 - 26/07/2011, 13:57

Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  Dubbio float Cyanstack 4 1,791 20/11/2013, 12:58
Ultimo messaggio: Cyanstack
  [Guida] Il C++ CH.05: i puntatori digger 9 3,224 06/02/2013, 23:55
Ultimo messaggio: Pocciox
  [Guida] Conversione float<->int (UNION) digger 9 2,564 23/06/2012, 15:02
Ultimo messaggio: Marchrius



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