2012-02-10 6 views
0

shortの情報を1つのintに保存しておきたいのですが、後でネットワークを介して送信します(デモンストレーション、ネットワークコードはここにありません)。私はそれぞれshortの2バイトをprim(プリミティブ)変数にコピーしました。小さいタイプから大きなタイプにバイトをコピーする

#include <iostream> 
#include <stdio.h> 
#include <string.h> 
#include <string> 

int main() 
{ 
    unsigned int prim = 0; 
    short major = 0x0001; 
    short minor = 0x0000; 
    prim = 0; 
    memcpy(&prim, &major, 2); 
    memcpy(&prim+2,&minor, 2); 
    std::cout << "Prim: " << prim << std::endl; 

    return EXIT_SUCCESS 
} 

私は後で、私は正しい出力を取得します(上記のコードで書かれたもの)minor、その後、major最初にコピーする場合:バイナリ表現、私のCPUはリトルエンディアンですので

Prim: 1 

を次のようになります。

しかし
10000000 00000000 00000000 00000000 

、私はminorまずmajor緯度を意味し、順序を変更した場合えー、このように:

memcpy(&prim, &minor, 2); 
memcpy(&prim+2,&major, 2); 

が、私は0

Prim: 0 

を取得するのはなぜ?ことになっている。

00000000 00000000 10000000 00000000 
&prim

後に8バイト(2×はsizeof(INT))に65536

+0

すでに与えられた答えに次へ:あなたはのバイトサイズについて確認したい場合少なくともuintXX_tを使用してください。 intとshortのサイズについての保証はありません。 – stefaanv

+0

「00000000 00000000 10000000 00000000」は65536です。 – kennytm

+0

@stefaanv問題はタイプのサイズではありません。長い間ポインタのサイズで作業していない、私はポインタのさまざまなサイズの各タイプを忘れて、それは常に1バイトを指していると仮定。 – Amumu

答えて

4

&prim + 2ためポイントに等しいです。

ポインタをバイト単位で増やすには、char*にキャストする必要があります。

memcpy((char*)&prim+2, &major, 2); 
+0

ああ、私はそれをcharポインタにキャストする必要があります。ありがとう。 – Amumu

5

整数をより大きな整数に変換するより移植性の高い方法は、シフトすることです。あなたは労働組合を使用して、すべてこのポインタの計算を回避することができる正しいpoitersの計算に誤りを修正ほかに

uint16_t lo = 1; 
uint16_t hi = 2; 
uint32_t all = (hi << 16) + lo; 
2

#include <iostream> 

    union two_shorts_t { 
     unsigned int prim ; 
     struct shorts_t { 
      short major; 
      short minor; 
     } shorts; 
    } ; 

int main() 
{  
    two_shorts_t values; 

    values.shorts.major=1; 
    values.shorts.minor=0; 
    std::cout << "Prim: " << values.prim << std::endl; 

    values.shorts.major=0; 
    values.shorts.minor=1; 
    std::cout << "Prim: " << values.prim << std::endl; 

    return 0; 
} 
+0

これは実際にNICEです。ありがとう。 – Amumu

関連する問題