「機械語」の版間の差分

削除された内容 追加された内容
編集の要約なし
243 行
== 直接に文字指定したい場合 ==
たとえば、機械語で
9A B3 72
の合計46文字だけがバイナリディタに表示されるような機械語ファイルを作りたいとしましょう。
 
この場合、下記のようなコードになります。
254 行
int main() {
FILE *file;
char hairetu[23] = {0x9A, 0xB3, 0x72};
 
file = fopen("test.bin", "wb");
267 行
}
</source>
:(※ Windows7上でのgcc(MIn-GW)で動作確認.
 
実際に、バイナリエディタで調べてみれば、たしかに
9A B3 72
46文字だけが書き込まれている事を確認できまます。
 
 
注意点は、charを使う際に、引用符("")をつけない事です。
char型に引用符がついていないので、ここで書き込まれるのは16進の数値です。
 
なので、たとえば「0xGV」のように、16進数に無い英字に置き換えてみればエラーになります(実際にエラー表示されます)。
 
 
;別の例
一方、int型で次のようにコードを書くと、書き込まれる結果は違ってきます。理屈よりも、実験したほうが早いので、やりましょう。
 
:コード例
<source lang=c>
#include <stdio.h>
 
int main() {
FILE *file;
int hairetu[2] = {0x4A, 0xB6}; // ここが int型
 
file = fopen("test.bin", "wb");
if (file == NULL) {
printf("ファイルを書き込めませんでした");
 
return 0;
}
fwrite(hairetu, sizeof(int), sizeof(hairetu) / sizeof(hairetu[0]), file); // int型に変わった
fclose(file);
return 0;
}
</source>
 
;実験結果
:(※ バイナリエディタに表示される内容です。)
4A 00 00 00 B6 00 00 00
のようになります。 「00」が追加されている事に注目してください。
 
つまり、1つの整数あたり、16進数で8桁を用意している事になります。これは16の8乗は 4294967296 ですので、その値まで(またはプラスマイナスの符号を考慮してその半分)の大きさの整数までを保管できる記憶領域を、このコンパイラは1つの整数あたりに確保した事になります。
 
 
なので、もしもC言語で機械語として書き込む16進値を直接に指定したい場合には char 型で引用符をつけずに指定していく事になります。
 
{{substub}}