Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

64 bits cast in C99

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto UtenteMassimoB, Foto Utentefairyvilje

0
voti

[1] 64 bits cast in C99

Messaggioda Foto UtenteShockwaver » 22 mag 2014, 17:07

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_/
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[2] Re: 64 bits cast in C99

Messaggioda Foto UtenteTardoFreak » 22 mag 2014, 18:17

Io di solito uso una union per fare queste cose.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,4k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15764
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[3] Re: 64 bits cast in C99

Messaggioda Foto UtenteShockwaver » 22 mag 2014, 18:31

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 ;)).
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[4] Re: 64 bits cast in C99

Messaggioda Foto UtenteShockwaver » 22 mag 2014, 19:58

Bon, visto allora che non me l'ha sconsigliato nessuno, la prendo come pratica quanto meno dignitosa..
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

2
voti

[5] Re: 64 bits cast in C99

Messaggioda Foto UtenteDirtyDeeds » 22 mag 2014, 20:05

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];
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,7k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7013
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

1
voti

[6] Re: 64 bits cast in C99

Messaggioda Foto UtenteTardoFreak » 22 mag 2014, 20:15

Vero,
L' allineamento è un grosso problema, soprattutto sui micro a 32 bit.

Bravo Foto UtenteDirtyDeeds! =D>
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,4k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15764
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[7] Re: 64 bits cast in C99

Messaggioda Foto UtenteShockwaver » 22 mag 2014, 20:27

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..
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

3
voti

[8] Re: 64 bits cast in C99

Messaggioda Foto UtenteDirtyDeeds » 22 mag 2014, 20:29

L'endianness non c'entra con l'allineamento.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,7k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7013
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[9] Re: 64 bits cast in C99

Messaggioda Foto UtenteShockwaver » 22 mag 2014, 20:31

Mmmm hai ragione, ho fatto di tutta l'erba un fascio. Quel _Alignas a maggior ragione adesso mi servirà per mettermi al sicuro. Grazie
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[10] Re: 64 bits cast in C99

Messaggioda Foto UtenteDirtyDeeds » 22 mag 2014, 20:33

Se poi vuoi essere sicuro anche sulle dimensioni dell'intero puoi usare il tipo

Codice: Seleziona tutto
uint64_t
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,7k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7013
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

Prossimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti