「機械語」の版間の差分
削除された内容 追加された内容
編集の要約なし |
|||
243 行
== 直接に文字指定したい場合 ==
たとえば、機械語で
9A B3 72
の合計
この場合、下記のようなコードになります。
254 行
int main() {
FILE *file;
char hairetu[
file = fopen("test.bin", "wb");
267 行
}
</source>
:(※ Windows7上でのgcc(MIn-GW)で動作確認.)
実際に、バイナリエディタで調べてみれば、たしかに
9A B3 72
の
注意点は、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}}
|