- ベストアンサー
キャストを使った型拡張の方法について
変数が以下のように宣言されている時で、掛け算する場合のキャスト の方法について質問です。 char = data1; short = data2; long = GOUKEI; (1) GOUKEI = (long)data1 * (long)data2; (2) GOUKEI = (long)(data1 * data2 ); 上記、(1)、(2)のキャストは同じ意味と判断して良いのでしょうか? 詳しい方ご回答よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
(1) の方は先に long にしてから計算しますが, (2) の方は int (ないし int 経由で unsigned int) で計算してから long に変換します. だから, 一般には違います.
その他の回答 (2)
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
16ビットCPU用のコンパイラでは結果が異なるでしょうね。 例えば char型⇒8ビット(符号1ビット、整数部7ビット) int型、short型⇒16ビット(符号1ビット、整数部15ビット) long型⇒32ビット(符号1ビット、整数部31ビット) と言う実装をしたコンパイラでは、(1)の式では問題ありませんが、(2)の式ではオーバーフローが起きる場合があります。 従って「(1)の式は環境に依存しないが、(2)の式は環境に依存する」と言う違いがあり、意味も違います。
お礼
回答ありがとうございます。 コンパイラに依存するとは考えが及びませんでした。 このような知識を教えて頂いて勉強になりました。
- SaKaKashi
- ベストアンサー率24% (755/3136)
意味が違います。 >(1) GOUKEI = (long)data1 * (long)data2; data1とdata2をlong型としてかけ算します。 >(2) GOUKEI = (long)(data1 * data2 ); data1とdata2を元の型のままかけ算します。その答えをlong型にします。 が、charをかけ算に使うのはいかがなものかと思いますけど。
お礼
回答ありがとうございます。 (2)の方法だとオーバーフローした結果をlong型に拡張するハメ になってしまうんですね。 勉強になりました。
お礼
回答ありがとうございます。 キャスト拡張にもやり方によっては優先順位で 結果が違ってしまうという事があるのですね。 勉強になりました。