負値の表現方法

[戻る]
匿名さん。 2005/06/21(火) 17:48:56
凄く単純&基本的な事かも知れませんが、教えてください。
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

長くてすみません。回答宜しくお願いします。

YuO [E-Mail] 2005/06/21(火) 18:02:49
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]);
のように書くことになります。

匿名さん。 2005/06/21(火) 18:27:27
回答ありがとうございます。

>shortやcharは常にintに,floatは常にdoubleに変換します。
>printf("s[%d] = \x%04hx\n", i, s[i]);

初めて知りました。有難うございます。
MSDNの
・printf 関数の型フィールド文字
・printf 関数と wprintf 関数の書式指定フィールド
を読んでみました。

「h」について調べましたが確かにshortの明示でしたね。
しかしfloatの明示が見つからなかったのですがコレも別途
オプションあるんでしょうか?

YuO [E-Mail] 2005/06/21(火) 18:57:21
> 「h」について調べましたが確かにshortの明示でしたね。
> しかしfloatの明示が見つからなかったのですがコレも別途
> オプションあるんでしょうか?

floatを示すものは存在しないです。
浮動小数点関連だと,long doubleのLだけが定義されています。
# doubleを出力するのに%lfとするのは誤用。ただし,C99で認められた。

匿名さん。 2005/06/22(水) 09:47:32
[[解決]]
回答有難うございました。m(__)m

古いスレッドには追加発言できません。