View Full Version : [C-gcc] Printf per esadecimali
TuLKaS85
24-02-2009, 10:19
salve,
devo stampare delle variabili double in rappresentazione esadecimale
usando il formato %X mi viene restituito un valore come se la variabile fosse float cioè a 8 cifre (32 bit) .
uso codeblock come ide.
come faccio a vedere le 16 cifre esadecimali che rappresentano per intero i 64 bit(8 byte) della mia variabile double ??
grazie!
TuLKaS85
24-02-2009, 11:14
sono riuscito a stampare tutto il double usando due volte il formato %X
esempio
printf("\n%d %X %X",n,vardouble);
il problema è che la variabile double viene stampata male, cioè :
3D77873A BFF85364
anzichè
BFF853643D77873A
che è il valore esatto.
Praticamente le coppie di 4 byte sono stampate al contrario...
prova col formato %llX (elle minuscola, elle minuscola, X); non sono sicuro che funzioni peró.
TuLKaS85
24-02-2009, 12:28
si c'avevo provato...
mi sà che la printf gestisce male gli esadecimali.
maulattu
24-02-2009, 12:45
double d = 192.002f;
long long numToPrint = *((long long *)(&d));
printf("%lld\n", numToPrint);
prova a vedere se funziona
AnonimoVeneziano
24-02-2009, 13:05
printf("\n%d %X %X",n,vardouble);
E se togli lo spazio tra i due %X%X ?? :D
wingman87
24-02-2009, 13:14
E se togli lo spazio tra i due %X%X ?? :D
Rimarranno comunque invertiti. A meno di doti nascoste del printf a me ignote
AnonimoVeneziano
24-02-2009, 13:22
Rimarranno comunque invertiti. A meno di doti nascoste del printf a me ignote
Ahhh, non avevo notato che il problema era nella inversione, pensavo fosse lo spazio, non ho guardato bene :D
wingman87
24-02-2009, 13:35
Ahhh, non avevo notato che il problema era nella inversione, pensavo fosse lo spazio, non ho guardato bene :D
Lo immaginavo :D
AnonimoVeneziano
24-02-2009, 13:38
Così forse va :)
#include <stdio.h>
int main(int argc, char** argv)
{
double d = 192341.231;
printf("%016llX\n", d);
return 0;
}
Ciao
TuLKaS85
24-02-2009, 16:19
vi ringrazio per i suggerimenti...
il fatto del passaggio all'indirizzo di maulattu non và, ma in tutti i casi per quello che serve a me nn andrebbe bene comunque.
x animoveneziano, anche quello non funge, avevo provato già a dare un formato più lungo, ma il problema x quello che ho capito consiste nel fatto che la printf vede %X come una rappresentazione a 4 byte, se si cerca di rappresentare un double è come se restassero gli altry 4 byte a spasso nel buffer di stampa, e si possono recuperare aggiungendo un secondo %X
il guaio è che anche così escono invertiti... potrei agire manualmente sui bit, ma sto arrangiando così.
Il fatto è che devo vedere gli esadecimali per confrontare dei valori, mi sarebbe comodo usare il visualizzatore di codeblock sotto debug ma nn funge con gli esadecimali !
quindi sto andando piano piano con le prontf...
int *temp = (int *)&vardouble;
printf("%X%X", temp[0], temp[1]);
L'ordine lo puoi cambiare come più ti piace.
AnonimoVeneziano
24-02-2009, 18:10
vi ringrazio per i suggerimenti...
il fatto del passaggio all'indirizzo di maulattu non và, ma in tutti i casi per quello che serve a me nn andrebbe bene comunque.
x animoveneziano, anche quello non funge, avevo provato già a dare un formato più lungo, ma il problema x quello che ho capito consiste nel fatto che la printf vede %X come una rappresentazione a 4 byte, se si cerca di rappresentare un double è come se restassero gli altry 4 byte a spasso nel buffer di stampa, e si possono recuperare aggiungendo un secondo %X
il guaio è che anche così escono invertiti... potrei agire manualmente sui bit, ma sto arrangiando così.
Il fatto è che devo vedere gli esadecimali per confrontare dei valori, mi sarebbe comodo usare il visualizzatore di codeblock sotto debug ma nn funge con gli esadecimali !
quindi sto andando piano piano con le prontf...
guarda, a me su archlinux64 va.
Questo è l'output che ottengo dal programma che ti ho postato sopra :
[hades@artemis ~]$ nano prova.c
[hades@artemis ~]$ gcc prova.c -o prova
[hades@artemis ~]$ ./prova
00007FFF8C5C2B48
[hades@artemis ~]$
vBulletin® v3.6.4, Copyright ©2000-2024, Jelsoft Enterprises Ltd.