Je sais comment faire un transfert de bits, mais mes valeurs semblent s'écarter du bord et je perds la valeur d'origine en essayant de conserver 8 bits.Comment coder des entiers non signés 16 et non signés de 32 bits dans une matrice de mémoire 8 bits non signée?
Répondre
Pour Entier non signé 16 bits:
unsigned short val16 = 0x1234;
unsigned char enc[2];
enc[0] = val16 & 0xff; // stores 0x34 to enc[0]
enc[1] = val16 >> 8 & 0xff; // stores 0x12 to enc[1]
Pour Entier non signé 32 bits:
unsigned int val32 = 0x12345678;
unsigned char enc[4];
enc[0] = val32 & 0xff; // stores 0x78 to enc[0]
enc[1] = val32 >> 8 & 0xff; // stores 0x56 to enc[1]
enc[2] = val32 >> 16 & 0xff; // stores 0x34 to enc[2]
enc[3] = val32 >> 24 & 0xff; // stores 0x12 to enc[3]
Mise à jour
exactement les mêmes codes avec littéraux décimaux sont:
unsigned short val16 = 4660; // 4660 = 0x1234
unsigned char enc[2];
enc[0] = val16 & 255;
enc[1] = val16 >> 8 & 255;
et
unsigned int val32 = 305419896; // 305419896 = 0x12345678
unsigned char enc[4];
enc[0] = val32 & 255;
enc[1] = val32 >> 8 & 255;
enc[2] = val32 >> 16 & 255;
enc[3] = val32 >> 24 & 255;
merci! est-il possible de le faire sans utiliser le type de données hexadécimal? – bigdog225
@ bigdog225 Oui, bien sûr. J'ai utilisé des littéraux hexadécimaux dans la réponse juste pour clarifier les limites de chaque octet dans une valeur de 2 octets ou de 4 octets. Vous pouvez utiliser d'autres types littéraux, tels que des nombres décimaux. – nglee
comment ferais-je cela avec des décimales? si cela ne vous dérange pas de me montrer – bigdog225
Cela pourrait très bien être une question intéressante mais vous allez devoir fournir plus d'informations - par exemple, le code de l'échantillon, l'entrée de l'échantillon et la sortie de l'échantillon qui montre le problème. [mcve] – davidbak