負値の表現方法 – プログラミング – Home

通知
すべてクリア

[解決済] 負値の表現方法


匿名さん。
 匿名さん。
(@匿名さん。)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

凄く単純&基本的な事かも知れませんが、教えてください。
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
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

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]);
のように書くことになります。


返信引用
匿名さん。
 匿名さん。
(@匿名さん。)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

回答ありがとうございます。

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

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

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

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

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


返信引用
匿名さん。
 匿名さん。
(@匿名さん。)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

回答有難うございました。m(__)m


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました