2016-11-15 1 views
4

Je me demande pourquoi quand je copie un numéro de 16 bits à un tableau à deux octets, il en résulte que la copie du premier index du tableau. Mon code est le suivant:Copie d'un nombre entier à un tableau à deux octets 16 bits

#include <iostream> 
#include <stdint.h> 
#include <stdio.h> 
#include <cstring> 



using namespace std; 


int main(){ 
    uint16_t my_num = 1; // This should be 0000 0000 0000 0001, right? 
    unsigned char my_arr[2]; // This should hold 16 bits, right? 

    memcpy(my_arr, &my_num, sizeof(my_num)); // This should make my_arr = {00000000, 00000001}, right? 

     printf("%x ", my_arr[0]); 
     printf("%x ", my_arr[1]); 
     cout << endl; 
     // "1 0" is printed out 


     return 0; 
} 

Merci à l'avance.

+3

Votre appareil semble être peu endian. Les octets consécutifs sont stockés dans l'ordre "inverse" - d'abord '0x01', puis' 0x00'. –

+1

On dirait que boutisme a votre chemin, puisque vous avez peut-être obtenu '00.000.001 000000000' – Shark

Répondre

7

Ceci est dû à endianness de votre plate-forme. Les octets de uint16_t multi-octets sont stockés dans l'espace adresse octet le plus bas en premier. Vous pouvez voir ce qui se passe en essayant le même programme avec un nombre qui est supérieur à 256:

uint16_t my_num = 0xABCD; 

Le résultat aura 0xCD dans le premier octet et 0xAB dans le second octet.

Vous pouvez forcer un boutisme spécifique en utilisant des fonctions de hton/ntoh family.

+0

Merci. Cela l'expire bien. Y a-t-il un moyen de faire un "memcpy" qui ne dépend pas de l'endianness? – user98651

+1

@ user98651 'memcpy' ne dépend pas de l'endianness, c'est ce qui est stocké dans' my_num' qui est "inversé" par le matériel. Vous pouvez le mettre dans l'ordre du réseau en appelant 'my_num = htons (my_num);' avant 'memcpy', en supposant que vous avez' '. – dasblinkenlight

+0

La méthode Htons est ce que je cherchais. Merci – user98651