【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21553

キャストについて
投稿者---chu-(2005/06/22 16:36:36)


自分の書いたソースにはAのような形のかなりの数のキャストがあります。
C/C++系のサイトを読んでいるとキャストを無くそうという感じの記述をあちこちで見ました。
どう書き直そうか悩んでいます。

shortの意図   - RAM節約
(long)の意図  - 16bitシステムのためlongにしないとオーバーフローする
(short)の意図 - 大きい変数から小さい変数へ入れるのに明示しないのは気持ち悪く感じるため

「(short)の意図」が出来ないのは慣れる事にして、Bあたりが一般的なのでしょうか。

short src;
short dst;
    long val;
    /* A:現在 */
    dst = (short)((long)src * 12345 / 10000);
    /* B:このあたりが適当? */
    dst = (long)src * 12345 / 10000;
    /* C:キャストは無いけど醜い */
    dst = (val = src) * 12345 / 10000;




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:キャストについて 21555 nop 2005/06/22 17:10:37
<子記事> Re:キャストについて 21557 Ban 2005/06/22 17:46:36
<子記事> Re:キャストについて 21582 chu- 2005/06/23 10:44:49


No.21555

Re:キャストについて
投稿者---nop(2005/06/22 17:10:37)


> shortの意図 - RAM節約

ローカル変数に限っては、
多くの環境ではスタックに取られる事が多いため、
intにしようがlongにしようが、
使用するRAMサイズは変わらない場合が多いです。

また、16bitの環境であれば、
int で宣言すれば大抵はshortと一緒になります。
shortよりintでよいのではないでしょうか?

どうしてもオーバーフローがある所のみ、
longにキャストして演算するのがよいかと思います。


この投稿にコメントする

削除パスワード

No.21557

Re:キャストについて
投稿者---Ban(2005/06/22 17:46:36)


C++ だとこんな感じでどうでしょう。(C ならstatic_cast を括弧に変更)

dst = static_cast<short>(static_cast<long>(src) * 12345L / 10000L);

12345を明示的に L とすれば、src は long で計算される気もしますが、
意図を明確に示す意味で上記のようにしてみました。(ちょっとくどいかも..ほぼA)

いずれにしろ、全てのキャストを撲滅するものではないでしょうし、
数値の範囲のような、必要なものはそのままでいいと思います。

ただし、C++ であれば、C 互換のキャストは全廃して、
用途別に下記の4キャストを推奨したいところです。
static_cast,dynamic_cast,const_cast,reinterpret_cast

# RAMサイズに制限があるエンベデッド環境ですか。
# ローカルスタックに long くらいは乗らないでしょうか。それが一番綺麗かと。


この投稿にコメントする

削除パスワード

No.21572

Re:キャストについて
投稿者---カンナ(2005/06/23 00:50:01)


「キャストを無くそう」というのは、
「ソース上の文字列としてのキャスト表現を減らそう」という意味ではなく
「キャストの必要ないロジックを心がけよう」というような意味だと思いますよ。

A→Bはただ単にソース上の文字列としてのキャストはなくなっていますが実際には行なわれています。
実際に行なっていることを隠蔽するよりは、キャストにて明示するほうがソースとしては優れていると思います。


この投稿にコメントする

削除パスワード

No.21582

Re:キャストについて
投稿者---chu-(2005/06/23 10:44:49)


返信ありがとうございます。

「Cプログラミング診断室→第4章キャストが好き→自動的型変換」
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.3.html

上記サイトを読んで、暗黙の型変換がされるならば記述すべきじゃなく、それが一般的。
そう読み取って、型が変わる部分を明示しないのは気持ち悪いものの、B等に書き直すべきか考えていました。
しかし、返信を読む限りではAのままでも特に印象の悪いコードではなさそうで安心しました。

> shortよりintでよいのではないでしょうか?

環境によって数値範囲が大幅に変わる型をデータの型に採用するのは気持ち悪く感じてしまうのです。
現在intはループカウンタ程度でしか使用していません。
intにするメリットとしてどのようなものがあるのでしょうか。

最後に、言葉が足らなかった&端折りすぎていた部分を補足します。

/* コンパイラはC */
short src;          /* データ:グローバル */
short dst;          /* データ:グローバル */
short srcrate;      /* データ:グローバル */
short dstrate;      /* データ:グローバル */
    long val;       /* 作業用:ローカル */
    /* A:現在 */
    dst = (short)((long)src * dstrate / srcrate);
    /* B:このあたりが適当? */
    dst = (long)src * dstrate / srcrate;
    /* C:キャストは無いけど醜い */
    dst = (val = src) * dstrate / srcrate;




この投稿にコメントする

削除パスワード

No.21583

Re:キャストについて
投稿者---nop(2005/06/23 11:02:05)


> intにするメリットとしてどのようなものがあるのでしょうか。

メリット云々ではなく、Cではint以下のスカラ型は、
演算時には暗黙にintに型変換されます。
つまり、

 short a = 1, b = 2, c;
 c = a + b;



 short a = 1, b = 2, c;
 c = (short)( (int)a + (int)b );

と等価です。
つまり、shortを使うメリットが少ない、
と言う事かと思います。

そもそも、intはその環境において、
最も効率よく扱える型である訳なので、
わざわざintを避けるのはどうかと思います。


この投稿にコメントする

削除パスワード

No.21584

Re:キャストについて
投稿者---YuO(2005/06/23 11:09:17)


> 環境によって数値範囲が大幅に変わる型をデータの型に採用するのは気持ち悪く感じてしまうのです。

それを言うと,Cではどの型も使うことが出来ません。
規格で定められているのは,最低限扱える範囲であり,データ型のサイズではないからです。
# まぁ,charは1バイトくらいは定められていますが。1オクテットとは限らないですけどね。



この投稿にコメントする

削除パスワード

No.21585

Re:キャストについて
投稿者---chu-(2005/06/23 11:54:45)


返信ありがとうございます。

納得しました。

・どちらでもいいならintを使う
・どちらかにメリットがあるならそっちを使う
・ローカル変数は積極的にintを使う

以下の前提条件がある場合、データ型にはshortを使ったほうがよさそうです。

・32ビットシステム製作時にコードを流用する可能性が高い
・その32ビットシステムはCPU速度に余裕がある
・その32ビットシステムはRAM容量が厳しい



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧