- ベストアンサー
DWORDからWORD、BYTEに
C言語初心者です。 DWORDの値を2つのWORD、4つのBYTEにそれぞれ分割したいのですが、 恥ずかしながら方法 がわかりません。 どなたかご教示頂けますでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
最も簡単な方法はunionを使います。 union { DWORD d; WORD w[2]; BYTE b[4]; } u; u.d = 元の値; u.w[0] → 元の値の下位WORD値 u.w[1] → 元の値の上位WORD値 u.b[0] → 元の値の最下位BYTE値 u.b[3] → 元の値の最上位BYTE値 上記はIntelのようなリトルエンディアンの場合です。 ビッグエンディアンのCPUでは上位下位が反対に なります。 尚、下位16ビットだけ、上位16ビットだけなら シフトでも処理できます。 DWORD d; WORD w; BYTE b; w = (WORD)d; //下位16ビット w = (WORD)(d>>8);//上位16ビット b = (BYTE)d; //最下位8ビット b = (BYTE)(d>>24);//最上位8ビット こちらはエンディアンに影響されません。
その他の回答 (3)
- chie65536(@chie65535)
- ベストアンサー率44% (8755/19867)
移植性が皆無になるので、C言語では「やっちゃいけないこと」に分類されるけど #ifdef _little_endian #define _LOWW 0 #define _HIW 1 #define _LLB 0 #define _LHB 1 #define _HLB 2 #define _HHB 3 #else #define _LOWW 1 #define _HIW 0 #define _LLB 3 #define _LHB 2 #define _HLB 1 #define _HHB 0 #endif union WordU { DWORD dd; WORD wd[2]; BYTE bd[4]; }; void main(void) { union WordU d; DWORD dword = 0x01234567; WORD lowword; BYTE lowlowbyte; d.dd = dword; lowword = d.wd[_LOWW]; lowlowbyte = d.bd[_LLB]; } って方法もある。
お礼
ありがとうございました。 Cではやっちゃいけないことになっているんですね…勉強になります。 構造体で宣言されたDWORDだったのでunionを使った分割方法は控えさせていただきました。
- FAY
- ベストアンサー率49% (95/193)
ビット演算でやってもいいんですがマクロを使うとより楽かな。 DWORDを二つのバイトにするにはHIWORDおよびLOWORD、 BYTE4つにするにはHIWORDおよびLOWORDで取得したWORD値に対して それぞれHIBYTEとLOWORDを使うとかね。 DWORD dwData = 0x12345678; WORD wData1 = HIWORD(dwData); WORD wData2 = LOWORD(dwData); BYTE byData1 = HIBYTE(wData1); BYTE byData2 = LOBYTE(wData1); BYTE byData3 = HIBYTE(wData2); BYTE byData4 = LOBYTE(wData2); とか。
お礼
とても分かりやすく教えていただき、ありがとうございます。 すでにビット演算でばらばらにする方法を選択させていただいたのですが、 マクロを使うとプログラムが短縮化できそうですね。 あとは処理速度比較でしょうか。。。。 この点は要調査ですね。
- D-Matsu
- ベストアンサー率45% (1080/2394)
DWORD/WORD/BYTEともCの標準型ではありませんからコードはそれぞれの定義次第です。 が、とりあえずビット論理積演算とビットシフトが出来るようになれば作ることはできるはずです。
お礼
ありがとうございます。 Cの標準型でないのは分かったのですが、何か簡単な解決方法が無いかと思いまして。。。 とりあえず、ビットシフトを繰り返して分ける方法を選択しました。
お礼
分かりやすいご回答ありがとうございました。 なるほど、環境依存型だそうですがunionという方法もあるんですね。。。 勉強になりました。 今回は既に構造体の中に組み込んだDWORDだったので、ビット演算で1ビットずつ分けて行く方法を取らせていただきました。 ありがとうございます。