long→byte変換

解決


hyde  2012-02-22 23:22:45  No: 73203

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-23 01:19:11  No: 73204

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

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


tetrapod  2012-02-23 03:02:13  No: 73205

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

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

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


hyde  2012-02-23 06:28:46  No: 73206

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加