2016-11-15 3 views
4

2バイト配列に16ビットの数値をコピーすると、なぜ配列の最初のインデックスにのみコピーされるのか不思議です。 私のコードは次のとおりです。16ビット整数を2バイト配列にコピー

#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; 
} 

ありがとうございます。

+3

あなたのマシンはリトルエンディアンのようです。連続するバイトは、逆順に格納されます。最初は '0x01'、その後は' 0x00'です。 –

+1

あなたは '00000001 000000000' – Shark

答えて

7

これは、お使いのプラットフォームのendiannessが原因です。マルチバイトuint16_tのバイトは、最低バイトファーストのアドレス空間に格納されます。あなたは256よりも大きい数で同じプログラムを試みることによって何が起こっているかを見ることができます。

uint16_t my_num = 0xABCD; 

結果は、第二のバイトで最初のバイトで0xCD0xABを持つことになります。

hton/ntoh familyの関数を使用して特定のエンディアンを強制することができます。

+0

ありがとうございましたので、エンパイアのように見えます。これはそれをよく守る。エンディアンに依存しない "memcpy"を行う方法はありますか? – user98651

+1

@ user98651 'memcpy'はエンディアンに依存しません。ハードウェアによって「逆転」される' my_num'に格納されています。あなたが ''を持っていると仮定して、 'memcpy'の前に' my_num = htons(my_num); 'を呼び出すことで、ネットワーク順に置くことができます。 – dasblinkenlight

+0

htonsメソッドは、私が探していたものです。ありがとう – user98651

関連する問題