PDA

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

fero86
24-02-2009, 11:15
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...

cionci
24-02-2009, 17:00
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 ~]$