Newsgroup: it.comp.programmare.win32
Titolo: #ifdef BIGENDIAN

Ciao ragazzi... m'ero imbattuto nel dubbio di poter/saper verificare da 
C se il pc su cui gira il software gestisce la memoria come little 
endian o big endian.
Allora mi è tornato in mente uno stralcio di codice per generare il 
fingerprint nei sorgenti del gpg, dove c'era:
#ifdef BIGENDIAN (oppure controllava LITTLEENDIAN non ricordo) così ho 
fatto questa prova:
#ifdef BIGENDIAN
   printf("BIG ENDIAN\n");
#else
   printf("LITTLE ENDIAN\n");
#endif
e il pc mi visualizza BIG ENDIAN
Ora... io ho un Intel PIV e nn credo che sia un big endian anche perchè con
char x[5]={0x41,0x42,0x43,0x44,0x00);
unsigned long int *y=(unsigned long int *)x;
printf("%08x",*y);
ottengo 0x44434241, che vuol dire che i byte secondo y (che è un long) 
sono ordinati dal più piccolo al più grande e quindi me li visualizza al 
contrario.
Utilizzo Dev-C++ 4.9 sotto Win2k.
Come mai mi viene visualizzato BIG ENDIAN se il pc *sicuramente* è in 
little endian?
Thx in anticipo!
-- 
Rivolterò il mondo per trovarlo, e anche se andasse in Indocina uno dei 
nostri starà nascosto in una ciotola di riso pronto a sparargli nel culo.
(Pulp Fiction)

Ho scoperto l'errore:
le istruzioni dell' #ifdef BIG_ENDIAN vengono compilate perchč 
BIG_ENDIAN č definita, ma non indica se la memoria viene gestita o meno 
in big endian. Sicuramente lo scopo sarą un altro.
Per vedere se la memoria č gestita in big endian si fa
#ifdef BIG_ENDIAN_HOST
Se a qualcuno dovesse servire...
P.S.: Ma BIG_ENDIAN_HOST fa parte dello standard o no?
-- 
Rivolterņ il mondo per trovarlo, e anche se andasse in Indocina uno dei 
nostri starą nascosto in una ciotola di riso pronto a sparargli nel culo.
(Pulp Fiction)

 P.S.: Ma BIG_ENDIAN_HOST fa parte dello standard o no?
Non dovrebbe.
-- 
Marco Barisione
http://hotkeybind.sf.net
http://marcobari.altervista.org

 contrario.
Che cavolo stai dicendo !!! ;)
Intanto tutti i processori della famiglia x86 (indipendentemente dal
produttore: Intel, AMD, Cyrix, ecc...) lavorano in "little-endian".
Se dall'array:
char x[5]={0x41,0x42,0x43,0x44,0x00);
ottieni il valore long di 0x44434241, vuol dire che il byte di ordine piu'
basso del long (0x41) viene memorizzato nella locazione di memoria piu'
bassa ----> quindi little-endian !

 bassa ----> quindi little-endian !
E io che ho detto, scusa?
Ho detto appunto che puntando a x con un puntatore a long, e stampando 
il tutto a video, ottengo i bytes nell'ordine inverso a quello 
dichiarato nel vettore di char.
Il che vuol dire che per il mio pc una variabile long possiede i byte 
meno pesanti a sinistra e i più pesanti a destra.
E con questa "convinzione" mi visualizza il mio array con i bytes 
nell'ordine inverso a quello che ho assegnato io.
Il che vuol dire che ho confermato la mia ipotesi iniziale secondo cui 
devo trovarmi in little_endian...
Se rileggi il mio post sicuramente noti che ho detto questo.


 meno pesanti a sinistra e i pių pesanti a destra.
Ehhh ??? Noooo ! ;)
Ma cosa vuol dire che sul tuo pc una variabile long possiede i byte meno 
pesanti a sinistra ?!!
Prendiamo il long 0x44434241. 0x44 e' sempre il byte "piu' pesante" e 
0x41 e' sempre il byte "meno pesante", indipendentemente dal pc o dal 
microprocessore !
Poi, a seconda di come viene scritto in memoria, qui possiamo avere big 
o little endian.

 microprocessore !
Si lo so, quello che voglio dire è che se un pc è fatto per il 
little_endian, per lui puntare ad un indirizzo di memoria per una 
variabile di 4 byte significa che il byte meno pesante sta a sinistra.
	Quindi, se in memoria con un dump vedo che ci sono i quattro bytes:
0x41  0x42  0x43  0x44
e con un long punto alla locazione con dentro 0x41, il pc che lavora in 
little_endian per visualizzarmi a schermo quella sequenza come numero 
unico piglierà 0x41 come byte meno pesante e 0x44 come byte più pesante 
mostrandomi 0x44434241.
Al contrario un pc che è progettato per il big_endian se deve 
considerare l'intera sequenza come un singolo dato, prenderà 0x41 come 
byte più pesante e 0x44 come meno pesante fornendomi proprio 0x41424344.
Al contrario, assegnando ad una variabile di 4 byte il numero 0x41424344 
questa avrà lo stesso valore sia per un pc che per l'altro.
Ma difatti la prova a cui ho sottoposto io il mio pc era proprio quella 
di scrivere sequenzialmente, dalla cella a indirizzo inferiore a quella 
a indirizzo superiore, i 4 byte 0x41 0x42 0x43 0x44.
A questo punto *so* che i byte sono scritti in quella maniera in 
memoria, e puntando con la long avrei potuto ottenere la sequenza 
invertita per il little_endian o tale e quale in big_endian.
Ottenendola al contrario di come l'ho scritta vuol dire che il pc l'ha 
presa in ordine inverso rispetto a come l'ho scritta.
Ho stato spiegato?
