• ベストアンサー

キャストを使った型拡張の方法について

変数が以下のように宣言されている時で、掛け算する場合のキャスト の方法について質問です。 char = data1; short = data2; long = GOUKEI; (1) GOUKEI = (long)data1 * (long)data2; (2) GOUKEI = (long)(data1 * data2 ); 上記、(1)、(2)のキャストは同じ意味と判断して良いのでしょうか? 詳しい方ご回答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

(1) の方は先に long にしてから計算しますが, (2) の方は int (ないし int 経由で unsigned int) で計算してから long に変換します. だから, 一般には違います.

dabuaku
質問者

お礼

回答ありがとうございます。 キャスト拡張にもやり方によっては優先順位で 結果が違ってしまうという事があるのですね。 勉強になりました。

その他の回答 (2)

回答No.3

16ビットCPU用のコンパイラでは結果が異なるでしょうね。 例えば char型⇒8ビット(符号1ビット、整数部7ビット) int型、short型⇒16ビット(符号1ビット、整数部15ビット) long型⇒32ビット(符号1ビット、整数部31ビット) と言う実装をしたコンパイラでは、(1)の式では問題ありませんが、(2)の式ではオーバーフローが起きる場合があります。 従って「(1)の式は環境に依存しないが、(2)の式は環境に依存する」と言う違いがあり、意味も違います。

dabuaku
質問者

お礼

回答ありがとうございます。 コンパイラに依存するとは考えが及びませんでした。 このような知識を教えて頂いて勉強になりました。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

意味が違います。 >(1) GOUKEI = (long)data1 * (long)data2; data1とdata2をlong型としてかけ算します。 >(2) GOUKEI = (long)(data1 * data2 ); data1とdata2を元の型のままかけ算します。その答えをlong型にします。 が、charをかけ算に使うのはいかがなものかと思いますけど。

dabuaku
質問者

お礼

回答ありがとうございます。 (2)の方法だとオーバーフローした結果をlong型に拡張するハメ になってしまうんですね。 勉強になりました。

関連するQ&A