凄く単純&基本的な事かも知れませんが、教えてください。
0~9の値が入った配列sと、0~-9の値が入った配列tがあります。
どちらもshort型です。これをprint文で4桁の16進数表示させたいです。
配列sはきちんと表示されますが、配列tは何故か8桁(4バイト)表示に
なってしまいます。単純に-1であれば、0xffffでは?と思うのですが、
すごーく基本的な事が間違ってるのでしょうか?環境はVC6です。
ソース:
int main(void)
{
short s[10], t[10];
int i;
for (i = 0; i < 10; i++){
s[i] = i;
t[i] = i * -1;
}
for (i = 0; i < 10; i++){
printf(s[%d] = 0x%04x\n, i, s[i]);
}
printf(\n);
for (i = 0; i < 10; i++){
printf(t[%d] = 0x%04x\n, i, t[i]);
}
return 0;
}
結果:
s[0] = 0x0000
s[1] = 0x0001
s[2] = 0x0002
s[3] = 0x0003
s[4] = 0x0004
s[5] = 0x0005
s[6] = 0x0006
s[7] = 0x0007
s[8] = 0x0008
s[9] = 0x0009
t[0] = 0x0000
t[1] = 0xffffffff
t[2] = 0xfffffffe
t[3] = 0xfffffffd
t[4] = 0xfffffffc
t[5] = 0xfffffffb
t[6] = 0xfffffffa
t[7] = 0xfffffff9
t[8] = 0xfffffff8
t[9] = 0xfffffff7
長くてすみません。回答宜しくお願いします。
printfのような,可変個引数に対応して引数を渡した場合,
shortやcharは常にintに,floatは常にdoubleに変換します。
shortを対象としていることを明示するには,hを使います。
つまり,
> printf(s[%d] = 0x%04x\n, i, s[i]);
は,
printf(s[%d] = \x%04hx\n, i, s[i]);
のように書くことになります。
回答ありがとうございます。
>shortやcharは常にintに,floatは常にdoubleに変換します。
>printf(s[%d] = \x%04hx\n, i, s[i]);
初めて知りました。有難うございます。
MSDNの
・printf 関数の型フィールド文字
・printf 関数と wprintf 関数の書式指定フィールド
を読んでみました。
「h」について調べましたが確かにshortの明示でしたね。
しかしfloatの明示が見つからなかったのですがコレも別途
オプションあるんでしょうか?
> 「h」について調べましたが確かにshortの明示でしたね。
> しかしfloatの明示が見つからなかったのですがコレも別途
> オプションあるんでしょうか?
floatを示すものは存在しないです。
浮動小数点関連だと,long doubleのLだけが定義されています。
# doubleを出力するのに%lfとするのは誤用。ただし,C99で認められた。
回答有難うございました。m(__)m