ページ 11

【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 00:43
by たかぎ
性懲りもなく、また雑談スレです。
タイトルの通りなのですが...

sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

例えば、

printf("%d\n", sizeof(int));

のようにしている人はどれぐらいいますか?
皆さん自身と周りの方の状況を教えてください。

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 00:58
by 組木紙織
>printf("%d\n", sizeof(int));
はいしてます。(でも最近はC++ばっかりなので、使ってないかな)
今まで見た限りではほかの方法で表示したのをみたことないですね。

#sizeof()の返す型は知ってるので、変数に入れるときはそれを使ってますけど。

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 01:01
by たかぎ
> はいしてます。(でも最近はC++ばっかりなので、使ってないかな)
> 今まで見た限りではほかの方法で表示したのをみたことないですね。

この方法が正しいと考えていますか?
それとも本来は別の方法が正しいけれども、何らかの事情でこの方法を使っていますか?

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 01:11
by 組木紙織
>この方法が正しいと考えていますか?
sizeof()は符号なし整数であるのに、"%d"で符号付き整数とみなしているので、
正しいとは考えていません。

>それとも本来は別の方法が正しいけれども、何らかの事情でこの方法を使っていますか?
理由は最初にみたサンプルがこの方法を使っていたからであることと、
正しい方法を示した記事やサンプルを見たことがなかったからです。

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 01:14
by Poco
> sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

使っています。
負値を表示しそうなくらい大きな値になりそうな場合、%uにしています。

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 01:17
by たかぎ
組木紙織さん、ぽこさんともに、符号の有無に関して正しくないので、本来であれば%uにすべきというご意見ですね。

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 01:23
by Poco
> 本来であれば%uにすべきというご意見ですね。
Yesです。

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 01:32
by 組木紙織
私は少し違います。
%uか%huか%luのいづれかが正しいだろうという考えです。

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 01:37
by やんち
> printf("%d\n", sizeof(int));
sizeof(int) の 結果が int の表現範囲に収まる事がわかっている場合に限り、
これは、問題ないと考えています。

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 01:42
by たかぎ
> sizeof(int) の 結果が int の表現範囲に収まる事がわかっている場合に限り、
> これは、問題ないと考えています。

なるほど。
組木紙織さんのご意見とも関係するのですが...
LLP64の環境では、size_tは64ビット、intやlongは32ビットです。
sizeof(int)は4になるのでintの表現範囲に収まります。
この場合、問題ないでしょうか?

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 02:11
by YuO
C90の名残で,
printf("%d", (int)sizeof(int));
または
printf("%u", (unsigned)sizeof(int));
とはやります (キャストは必須)。
必要そうならば%ldや%luでlong系を使います。
そもそも普段はC#使っていて,数少ないsizeofの出力機会があってもCよりC++を使うためにstd::cout << sizeof(int)で済んでしまうので,fprintf系への出力はあまりないですね。
# VC++使用なので,%zuは未対応が前提。

ただし,使い捨てでVC++専用の場合は,
printf("%d", sizeof(int));
を使うこともあります。

C99使える処理系でも,%zuとか%tiとかは (特にptrdiff_t用の後者) すっかり忘れていることが多いです。
ただ,「size_tがunsigned intとは限らない」ことは忘れないので,キャストで見かけの安全を確保している感じです。

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 02:29
by Dixq (管理人)
私はよほどの事が無い限りその状況で%uは使わないですね~。
何かのサイズを得るのに符号ビットが変わるほどの大きさになるような事ってあるのでしょうか?
2バイトで表現しているならあると思いますが。
4バイトにおいて、あったとしても私の使用範囲としてはレアなので、そういう時はそういう時でまた考えると思います。
仕様と厳密に合わせる事は必要だとは思いますが、そこまでの必要性が無いと思うところはいつも適当です。

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 03:01
by たかぎ
YuOさんのご意見のように、キャストするのがおそらく最も移植性のある現実解だと私も思います。
私の場合、C99限定なら%zdや%zuも使いますが...

> Dixqさん
> 仕様と厳密に合わせる事は必要だとは思いますが、そこまでの必要性が無いと思うところはいつも適当です。

これは仕様と厳密に合わせるだけでなく、結構現実的な問題だったりします。
早い話が、32ビット環境と64ビット環境の互換性の問題なのです。
Windowsしか相手しないような人でも、これは大きな問題だと思います。

(手元のMacでしか試していませんが)64ビット環境の場合、可変個の実引数は32ビットのint値を渡してもスタックには64ビットで積まれます。
ですので、本来、%luとか%lluとすべきところを%uとしても、リトルエンディアンであれば問題ないでしょう。
けれども、最近は環境も多様化していまして、モバイル環境ではCPUがARMだったりしてビッグエンディアンに遭遇することも少なくないのです。
これらは現在のところ32ビットだとは思いますが、近い将来64ビット化することは十分考えられます。
こうした場合にはやはり現実に問題が顕在化します。

わずかな努力で将来の問題を回避できるならそうすべきですよね。
このことは、今書いたコードが問題が顕在化するぐらい将来に再利用されるだけでなく、今身に付けている癖が問題が顕在化するぐらい将来まで尾を引くことも含めて考えるべきではないでしょうか。

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 05:42
by Ma
%d が絶対的に正しいと思っていました。
とりあえず、認識を改めます。

Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

Posted: 2010年6月05日(土) 15:57
by たかぎ
> Maさん
> %d が絶対的に正しいと思っていました。

このように書く人は結構いますからね。

とりあえず、ここでいったん解決にしたいと思います。
また、類似の雑談スレを立てますが、よろしくお願いします。