int型の空白部に0を代入するには?

解決


みや  2002-08-24 03:35:54  No: 50346  IP: [192.*.*.*]

現在VC++にてゲーム開発をしています。
ゲーム中のフラグ(unsigned int型)をセーブデータとして保存するプログラムを組んでいます。
intで宣言した変数(例えばOx0000000000001001)を、セーブデータファイルに保存するために WriteFile で書き込むようにしたいのですが、このまま書き込むと左側の 0 がすべて切り捨てられて0x1001だけがファイルに書き込まれてしまいます。
初心者的な質問ですいません。どなたかアドバイスをお願いします。

編集 削除
ケンタロ〜K  2002-08-24 13:53:11  No: 50347  IP: [192.*.*.*]

> intで宣言した変数(例えばOx0000000000001001)を、セーブデータファイルに保存するために WriteFile で
まず何が問題になっているかを考えなければなりません。
例えば、
(1) そのWriteFileがそのような動作(0 がすべて切り捨て)をするから問題になっている。
(2) コ〜ディング上での数値表現(例えば0x00001001)と、メモリ上での数値表現の違いをチェックしていない。

(1)について考えます。
その私製関数と思われるWriteFileが「正しく動作しているか」を確認します。
メモリの内容を媒体に書き込む関数と思われますので、書き込まれるべき内容を確認してください。
PC/AT互換機用VC++6の場合、プログラム実行していて、停止状態になっているならメモリの内容を表示できます。(デフォルトではAlt+6で表示)

(2)について考えます。
簡単の為に、例示します。(念のためにビルド対象がPC/AT互換機用のWin32アプリであると仮定します。)

int v = 0x12345678;

この場合、vはメモリ上でどのように表現されるのでしょうか。

(A) 12 34 56 78
(B) 78 56 34 12

Intel x86系CPU(Pentiumも含みます)やその互換CPUを使っているなら、答えは(B)です。
詳しくは知りませんが、(A)になるような環境も世の中にはあります。

(A)で表現される方法をビッグエンディアンと言い、
(B)で表現される方法をリトルエンディアンと言います。

このような違いがあるので環境によってトラブルを招くこともありますが、
Linuxアプリのコ〜ドを見ているとエンディアン切り替えに対応したコ〜ディングをよく見かけます。
(余談ですが、知りうる限りIP・TCP・UDP・DNSプロトコルでの数値表現はビッグエンディアンが用いられています。)

編集 削除
みや  2002-08-24 22:02:44  No: 50348  IP: [192.*.*.*]

ありがとうございます、ケンタロ〜Kさん。
そのような知識はまったくなく、どうしてだろうとずっとない頭を捻っておりました。
WriteFile は WinAPI のひとつで、指定した変数をファイルに書き込む関数です。
実際にint型の変数を書き込んでみると、下のバイトが先に書き込まれてました。
知識のなさから招いた誤解だったようです。
ありがとうございます、勉強になりました。

編集 削除