Originariamente inviato da Eduadie
Per quanto riguarda la union io la uso perchè a me sembra che i caratteri di shift sui float e double non posso utilizzarli...sbaglio?
No, infatti. Quello che ti sto dicendo è che:
  • la conversione "a pedate" tramite union tecnicamente non sarebbe consentita;
  • ma soprattutto, dato che a priori non è detto che ci siano interi con le dimensioni di un float o di un double, e se ci sono non è detto che siano sempre gli stessi al variare della piattaforma, lavorare in quel modo con degli interi non è una buona idea.

Ergo, invece di lavorare con interi fai una conversione ad un array di char, il cui funzionamento è garantito dallo standard e soprattutto non hai problemi di dimensioni diverse al variare della piattaforma - un double è grande esattamente sizeof(double) char, per cui puoi vedere la sua memoria come un array di sizeof(double) char una volta fatto un cast a (unsigned char *) del puntatore alla variabile double in questione (più complicato a dirsi che a farsi, il codice è nel post precedente).

A questo punto, tutto quello che rimane è scrivere la funzione stampa_binario, che deve stampare la rappresentazione binaria dell'array di unsigned char che gli viene passato.

Può essere una cosa del tipo:
codice:
#include <limits.h>

// ...

void stampa_binario(unsigned char * buffer, unsigned int length)
{
    for(unsigned int i=0; i<length; i++)
    {
        for(int b=CHAR_BIT-1; b>=0; b--)
            putchar(((buffer[i]>>b)&1)?'1':'0');
        putchar(' ');
    }
}
Nota che, su piattaforme little-endian, per vedere la rappresentazione binaria "come te la aspetti" è necessario invertire l'ordine di stampa dei bytes.