プロが教えるわが家の防犯対策術!

はじめまして。
C言語初心者です。今回の質問は構造体のメンバを他の構造体に格納するときにおきる不可解な現象です。
具体的には、
typedef struct gmsg{
int a;
int b;
int Dt[4];
}GMSG
上記のDt[4]を以下の構造体に代入していきます。
typedef struct msg{
char a;
char b;
char c;
char d;

int e;

short f;
char g;
char h;

char i;
char j;
char k;
char l;

char m;
char n;
short o;
}MSG
この際に以下のような処理を行っています。
この際GMSGを(ポインタ)pt_msgdt,(ポインタ)MSGをpt_SubDtとし、
pt_SubDt->a = (char)(pt_msgdt->Dt[0] ) & 0xFF;
pt_SubDt->b = (char)(pt_msgdt->Dt[0] >>8) & 0xFF;
pt_SubDt->c = (char)(pt_msgdt->Dt[0] >> 16 ) & 0xff;
pt_SubDt->d = (char)(pt_msgdt->Dt[0] >> 24)& 0xff;

pt_SubDt->e = (pt_msgdt->Dt[1]) & 0xFFFFFFFF;

pt_SubDt->f = (short)(pt_msgdt->Dt[2] & 0xFFFF);
pt_SubDt->g = (char)((pt_msgdt->Dt[2] >> 16) & 0xFF);
pt_SubDt->h = (char)((pt_msgdt->Dt[2] >> 24 ) & 0xFF);

pt_SubDt->i = (char)(pt_msgdt->Dt[3]) & 0xFF;
pt_SubDt->j = (char)(pt_msgdt->Dt[3] >> 8) & 0xFF;
pt_SubDt->k = (char)(pt_msgdt->Dt[3] >> 16) & 0xFF;
pt_SubDt->l = (char)(pt_msgdt->Dt[3] >> 24) & 0xFF;

pt_SubDt->m = (char)(pt_msgdt->Dt[4]) & 0xFF;
pt_SubDt->n = (char)(pt_msgdt->Dt[4] >> 8) & 0xFF;
pt_SubDt->o = (short)(pt_msgdt->Dt[4] >> 16) & 0xFFFF;
}
しかし処理結果をデバック中にDt[0],Dt[3],Dt[4]の0x79以下のデータはキャストが行いますが,0x80~0xffのデータに関しては4byteになり
0xffffff**といったキャスト結果になってしまいます。
例えると
Dt[3]=0x000000f120;
処理結果
h = 0x00
g = 0x00
f = 0xFFFFF120
といった結果になってしまいます。
この結果を0x80以上でもint->char,int->shortのようにキャストく色々な方法を試しましたが、わかりません。
よろしくお願いします。
ちなみにOSはLinux,コンパイラーはC言語で扱っているデータはリトルエンディアンのバイナリデータです。

A 回答 (2件)

単に符号拡張されてるだけでは。



char → unsigned char
short → unsigned short
みたいに符号無し型としてGMSGとMSGの両方を定義してみては。
    • good
    • 0

実際のデータは0xF120です。


表示時に符号拡張されているだけです。

printf("f = 0x%x\n", pt_SubDt->f)
ってやってませんか?
printfではshortではなくintで挿入されます。
printf("f = 0x%x\n", (unsigned short)pt_SubDt->f);
とすれば表示上の問題は無くなります。

実際に試してはないので、間違ってたらごめんなさい。
    • good
    • 0
この回答へのお礼

疑問が解けました。
構造体の宣言の段階でunsigned short宣言をしないと0x80以上はバグってしまっていました。
ありがとうございました。

お礼日時:2007/12/30 22:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!