1) (test1 << 8) fait huit décalages sur un registre de huit bits, ce qui revient en principe à tous les faire sortir et donc ramener le registre à zéro. Le C++ fait donc soit un transtypage implicite à priori, soit une optimisation spécifique à l'architecture et au compilateur, comme stocker des char sur des long et faire de l'alignement sur des adresses multiples de 4. Mais bon, passons.
2) Ce qui est surtout intéressant, c'est le bit de signe. 0x77, ça fait 119 en décimal et c'est un nombre positif. Par contre, sur huit bits signés, 0xaa, ça ne pas 170 mais -86 ! Comme tu utilises "+", tu obtiens une soustraction.
Utilise "unsigned char" plutôt que char pour commencer.
Ensuite, tu peux également utiliser une tableau "unsigned char tableau [2];" et déposer tes valeurs directement dedans avec tableau[0] et et tableau[1]. Au moins tu es sûr que tes valeurs sont concaténées en mémoire, et dans le bon ordre. Sachant cela, tu n'as plus qu'à les lire comme s'il s'agissait d'un short, en utilisant un transtypage (cast) :
short result = *(short *)tableau;
Ca peut être déroutant pour un coder de haut niveau, c'est la manière la plus naturelle de travailler pour le microprocesseur, qui ne fera aucune conversion dans le code final.
Enfin, tu essaies d'être propre et portable, tu oublies la dernière proposition et tu fais man ntohs.
[^] # Re: au hasard ...
Posté par Obsidian . En réponse au message deux char pour faire un short. Évalué à 5.
Un char fait huit bits de large, donc :
1) (test1 << 8) fait huit décalages sur un registre de huit bits, ce qui revient en principe à tous les faire sortir et donc ramener le registre à zéro. Le C++ fait donc soit un transtypage implicite à priori, soit une optimisation spécifique à l'architecture et au compilateur, comme stocker des char sur des long et faire de l'alignement sur des adresses multiples de 4. Mais bon, passons.
2) Ce qui est surtout intéressant, c'est le bit de signe. 0x77, ça fait 119 en décimal et c'est un nombre positif. Par contre, sur huit bits signés, 0xaa, ça ne pas 170 mais -86 ! Comme tu utilises "+", tu obtiens une soustraction.
Utilise "unsigned char" plutôt que char pour commencer.
Ensuite, tu peux également utiliser une tableau "unsigned char tableau [2];" et déposer tes valeurs directement dedans avec tableau[0] et et tableau[1]. Au moins tu es sûr que tes valeurs sont concaténées en mémoire, et dans le bon ordre. Sachant cela, tu n'as plus qu'à les lire comme s'il s'agissait d'un short, en utilisant un transtypage (cast) :
short result = *(short *)tableau;
Ca peut être déroutant pour un coder de haut niveau, c'est la manière la plus naturelle de travailler pour le microprocesseur, qui ne fera aucune conversion dans le code final.
Enfin, tu essaies d'être propre et portable, tu oublies la dernière proposition et tu fais man ntohs.
Si tu veux que je développe, tu n'hésites pas.