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