はじめまして。
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言語で扱っているデータはリトルエンディアンのバイナリデータです。
No.1ベストアンサー
- 回答日時:
単に符号拡張されてるだけでは。
char → unsigned char
short → unsigned short
みたいに符号無し型としてGMSGとMSGの両方を定義してみては。
No.2
- 回答日時:
実際のデータは0xF120です。
表示時に符号拡張されているだけです。
printf("f = 0x%x\n", pt_SubDt->f)
ってやってませんか?
printfではshortではなくintで挿入されます。
printf("f = 0x%x\n", (unsigned short)pt_SubDt->f);
とすれば表示上の問題は無くなります。
実際に試してはないので、間違ってたらごめんなさい。
疑問が解けました。
構造体の宣言の段階でunsigned short宣言をしないと0x80以上はバグってしまっていました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 積分についてです。 水平投射の微分方程式で、 m×dvx/dt=-Cvx (Cは粘性抵抗) を積分す 1 2022/10/06 19:45
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- 工学 計器用変成器(PT/CT)を用いた電力測定方法について 2 2022/08/16 11:09
- 数学 真ん中辺りにz(t)について解くと結果 z(t)=pce^pt/1+qce^ptとなると書いてありま 1 2023/04/21 22:14
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- リフォーム・リノベーション 壁紙について 5 2022/10/19 12:09
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
strchr() の第2引数はなぜ int ...
-
CStringをwchar_tに変換したい
-
_TCHAR*での引数の読み込み
-
間接操作のレベルとは
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
ftoa の作り方
-
標準ライブラリ関数の自作につ...
-
c言語です。
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
構造体のアライメント調整
-
間接参照のレベルが異なっています
-
文字列から空白を取り除きたい...
-
起動時の引数の取得方法が分か...
-
コマンドラインに入力されてい...
-
配列をnビットシフトする
-
RGB→YUV変換のプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報