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
すでに与えられた答えに次へ:あなたはのバイトサイズについて確認したい場合少なくともuintXX_tを使用してください。 intとshortのサイズについての保証はありません。 – stefaanv
「00000000 00000000 10000000 00000000」は65536です。 – kennytm
@stefaanv問題はタイプのサイズではありません。長い間ポインタのサイズで作業していない、私はポインタのさまざまなサイズの各タイプを忘れて、それは常に1バイトを指していると仮定。 – Amumu