みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

構造体のキャスト

はじめまして。
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言語で扱っているデータはリトルエンディアンのバイナリデータです。

投稿日時 - 2007-12-30 17:13:08

QNo.3638766

すぐに回答ほしいです

質問者が選んだベストアンサー

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

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

投稿日時 - 2007-12-30 17:59:00

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

実際のデータは0xF120です。
表示時に符号拡張されているだけです。

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

実際に試してはないので、間違ってたらごめんなさい。

投稿日時 - 2007-12-30 18:32:28

お礼

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

投稿日時 - 2007-12-30 22:41:58