long→byte変換

解決


hyde  2012-02-22 14:22:45  No: 73203  IP: 192.*.*.*

long型→byte型に変換したいのですが、
下の①と②では何か違いはあるのでしょうか。


BYTE byData[sizeof(long)];
long lnum = 50432221;


memcpy(byData, &lDrvCnt, sizeof(long));


*(byData    ) = (unsigned char)(lnum >> 24) ;
*(byData + 1) = (unsigned char)(lnum >> 16) ;
*(byData + 2) = (unsigned char)(lnum >>  8) ;
*(byData + 3) = (unsigned char)(lnum      ) ;

初歩的な質問で申し訳ないですが、
ご教授下さい。

編集 削除
仲澤@失業者  2012-02-22 16:19:11  No: 73204  IP: 192.*.*.*

>memcpy(byData, &lDrvCnt, sizeof(long));
は、
>memcpy(byData, &lnum, sizeof(long));
と解釈しますね。

んで、やってみればすぐ分かりますよね。
何か違いがあるどころじゃありませんよね(笑)。
ちなみに、(1)がやりたいなら自分なら
 *(( long *)byData) = lnum;
ってやりますけど(vv;)。

編集 削除
tetrapod  2012-02-22 18:02:13  No: 73205  IP: 192.*.*.*

Q.違いがあるか
という質問に対する答えは Yes か No で終了だが、そういう Q&A をお望み?

結果は「違う」(少なくとも Visual C++ では)
なぜ違うか、どう違うか、あたりは [エンディアン] で調べてみると吉。
# endian であって indian ではないので注意
どちらが正しい、ないし、適切かは、何をしたいか次第で違う。

(1) (2) は処理系によらず状況によらず絶対 segv らないけど
仲澤 氏のコードは segv る可能性が0ではないので俺ならやらない。
# x86 限定なら問題ないけど...

編集 削除
hyde  2012-02-22 21:28:46  No: 73206  IP: 192.*.*.*

わかりました。調べてみます。
ありがとうございました。

編集 削除