Posts ajout� avant le Rollback
Envoy� par c_boireau
Envoy� par Argol_Medusa
Envoy� par c_boireau
Envoy� par c_boireau
Posts ajout� avant le Rollback
Envoy� par c_boireau
Envoy� par Argol_Medusa
Envoy� par c_boireau
Envoy� par c_boireau
Salut !
Il me semble qu'il y a plus simple (tout est relatif...) si on a :
buf[13] pour l'octet de poids faible (LSB)
buf[14] pour l'octet de poids fort (MSB)
Ce serait int�ressant de savoir si �a ne fonctionne pas chez vous !
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2 double val = (*(short*)buf[13]) / 10.0;
A plus !
On reconnait les maniacs des pointeurs
L'avantage de votre solution c'est qu'elle est plus performente (gain de rapidit� CPU) puisqu'aucun calcul n'est fait, c'est juste une lecture de case m�moire.
question : quand vous �crivez short* c'est un short int* c'est bien cela ? donc un int* tout court ?
ou bien cela d�pend-il des compilateurs je ne sais plus?
ici c'est short car int sur c++ builder fait 32bits, donc short fait 16 bits comme le fait la methode de c++ builder non portable qui est __int16
sinon le code est bon
Autant pour moi, le int est en fait un long int.
char, unsigned char, signed char 1 byte
short, unsigned short 2 bytes
int, unsigned int 4 bytes
long, unsigned long 4 bytes
float 4 bytes
double 8 bytes
long double 8 bytes
Merci pour les explications![]()
Salut !
Oui ! On a une valeur d�finie sur deux octets � r�cup�rer, donc via un short !
En fait BCB sait optimiser. Lorsqu'il lit quelque chose comme :
Dans ce cas il se contente de charger un registre interne 16 bits (ex : la partie CX du registre ECX) : dans H et L (ex : CH et CL) sans faire ni de shift ni de multiplication.short <-- Byte1 << 8 + Byte2
ou bien :
short <-- Byte1 * 256 + Byte2
Ce m�canisme ne n�cessite donc que deux instructions machine (Intel).
A ceci pr�s qu'on a plus � faire � des mouvements en m�moire, de byte � byte (du fait des variables) !
C'est encore plus frappant avec un int... et je vous laisse en r�diger les shifts !
Comme cette donn�e est interpr�t�e en tant que valeur d�cimale, je me suis dit que le type double (et non float � cause de son manque de pr�cision) �tait plus appropri�.
Par contre, le code que j'ai donn� m�rite d'�tre contempl�... dans la fen�tre CPU... j'en suis rest�...!
A plus !
Long double = 80bits/8 = 10 bytes ou 10 octets
cf aide de C++ builder 6 dans Constantes et repr�sentation interne
Types de donn�es 32 bits, tailles et intervalles de valeurs
Type Taille (bits) Intervalle Applications exemple
long double 80 3,4*^*10^-4932 <= X <= 1,1*^*10^4932 Financi�re (pr�cision sur 18 chiffres)
Partager