Pagina 1 di 2

64 bits cast in C99

MessaggioInviato: 22 mag 2014, 17:07
da Shockwaver
Salve a tutti.
C'è una cosa che faccio già da qualche anno (o meglio, ho praticamente sempre fatto) ma solo ora mi pongo quesiti sulla sua eleganza o performanza.
Legale lo è, funzionante anche (a patto di non litigare con l'endianess dell'architettura), però non so se sia una cosa un po' sporca da fare..
Codice: Seleziona tutto
unsigned char b8[8];
unsigned long long ui8; // una variabile a 64 bit.

ui8 = *((unsigned long long *) b8); // per copiare da b8 a ui8 senza memcopy.


E' brutto o lo fate anche voi senza pensarci su?
Grazie.
O_/

Re: 64 bits cast in C99

MessaggioInviato: 22 mag 2014, 18:17
da TardoFreak
Io di solito uso una union per fare queste cose.

Re: 64 bits cast in C99

MessaggioInviato: 22 mag 2014, 18:31
da Shockwaver
Aaa anch'io! A volte però mi succede di avere un buffer da 8 byte esterno alla union, e così invece di fare una memcopy faccio un cast del puntatore al buffer e memorizzo il contenuto nella var da 64 bits (che magari è un elemento di una union ;)).

Re: 64 bits cast in C99

MessaggioInviato: 22 mag 2014, 19:58
da Shockwaver
Bon, visto allora che non me l'ha sconsigliato nessuno, la prendo come pratica quanto meno dignitosa..

Re: 64 bits cast in C99

MessaggioInviato: 22 mag 2014, 20:05
da DirtyDeeds
Ha due problemi (che vedo):

1) Non è garantito che il tipo long long sia a 64 bit: 64 bit è il minimo, ma potrebbe averne di più.

2) Non è detto che l'allineamento di un long long sia compatibile con quello di un array di char. Questo dovrebbe essere risolvibile con lo specificatore _Alignas:

Codice: Seleziona tutto
_Alignas(unsigned long long int) unsigned char b8[8];

Re: 64 bits cast in C99

MessaggioInviato: 22 mag 2014, 20:15
da TardoFreak
Vero,
L' allineamento è un grosso problema, soprattutto sui micro a 32 bit.

Bravo Foto UtenteDirtyDeeds! =D>

Re: 64 bits cast in C99

MessaggioInviato: 22 mag 2014, 20:27
da Shockwaver
Ok, la dichiarazione della variabile a 64 bit. era da prendere come tale de facto. Che sia quella corretta è un problema di cui mi occupo e mi accerto.
Per quanto riguarda l'allineamento, avevo già dato come ipotesi quella di "non litigare con l'endianess dell'architettura" e anche questo è un qualcosa di cui mi accerto a priori.

In XC32 un long long è 64 bit. L'allineamento per i PIC è big-endian e quel cast riesce a farmi quello di cui avevo bisogno.
Quindi se quelli sono gli unici problemi visibili direi che vado tranquillo allora..

Re: 64 bits cast in C99

MessaggioInviato: 22 mag 2014, 20:29
da DirtyDeeds
L'endianness non c'entra con l'allineamento.

Re: 64 bits cast in C99

MessaggioInviato: 22 mag 2014, 20:31
da Shockwaver
Mmmm hai ragione, ho fatto di tutta l'erba un fascio. Quel _Alignas a maggior ragione adesso mi servirà per mettermi al sicuro. Grazie

Re: 64 bits cast in C99

MessaggioInviato: 22 mag 2014, 20:33
da DirtyDeeds
Se poi vuoi essere sicuro anche sulle dimensioni dell'intero puoi usare il tipo

Codice: Seleziona tutto
uint64_t