こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

変数が以下のように宣言されている時で、掛け算する場合のキャスト
の方法について質問です。

char = data1;
short = data2;
long = GOUKEI;

(1) GOUKEI = (long)data1 * (long)data2;
(2) GOUKEI = (long)(data1 * data2 );

上記、(1)、(2)のキャストは同じ意味と判断して良いのでしょうか?
詳しい方ご回答よろしくお願いします。

投稿日時 - 2009-11-12 23:33:52

QNo.5443462

すぐに回答ほしいです

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

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

投稿日時 - 2009-11-12 23:51:59

お礼

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

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

勉強になりました。

投稿日時 - 2009-11-15 22:06:54

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

16ビットCPU用のコンパイラでは結果が異なるでしょうね。

例えば
char型⇒8ビット(符号1ビット、整数部7ビット)
int型、short型⇒16ビット(符号1ビット、整数部15ビット)
long型⇒32ビット(符号1ビット、整数部31ビット)
と言う実装をしたコンパイラでは、(1)の式では問題ありませんが、(2)の式ではオーバーフローが起きる場合があります。

従って「(1)の式は環境に依存しないが、(2)の式は環境に依存する」と言う違いがあり、意味も違います。

投稿日時 - 2009-11-13 15:58:57

お礼

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

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

投稿日時 - 2009-11-15 22:05:01

ANo.1

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

投稿日時 - 2009-11-12 23:37:54

お礼

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

(2)の方法だとオーバーフローした結果をlong型に拡張するハメ
になってしまうんですね。

勉強になりました。

投稿日時 - 2009-11-15 22:09:50