• [^] # Re: au hasard ...

    Posté par . En réponse au message deux char pour faire un short. Évalué à 1.

    Bon, je ne connais pas le C++, mais je connais le C, alors pardon si je dis des conneries:

    Un char fait huit bits de large


    En C, c'est faux. Le standard te dit qu'il fait au moins 8 bits de large (pour stocker jusqu'à 2^7-1). Mais il peut faire plus.

    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;


    Mauvaise idée...
    Rien ne te dit comment les données sont alignées en mémoire. Pour la plupart des processeurs, les données doivent être alignées à une adresse spécifique (multiple de 2, ou 4 par exemple pour un long). Lorsque tu fais un cast comme ça, tu peux lui demander d'aller chercher un short à une adresse qu'il n'aime pas, et provoquer une erreur de segmentation.
    C'est comme lorsque tu essaies de dépaqueter une structure:
    cf: http://c-faq.com/strangeprob/ptralign.html

    Les types ont une (bonne) raison d'exister: il ne faut pas utiliser un cast pour "prétendre que telle donnée est de tel type", ou pour demander au compilo de la fermer...