- 締切済み
C++でboolにintの値を代入することについて
VC9.0を使っているのですが、以下のような文を書くと 警告が出てしまいます。 int i = 100; //warning C4305: '初期化中' : 'int' から 'bool' へ切り詰めます。 bool a = i; この警告を出力させないために以下のようにすることに 問題はないでしょうか? int i = 100; bool a = static_cast<bool>(i); このキャストを行うとき、iの値が0ならaはfalse, iの値が0以外ならaはtrueとなることは保証されるのでしょうか? よろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
横槍ですが... > 処理系によってはboolの内部実装にunsigned charを使っていて、 > 256を入れるとオーバーフローして0になってしまうことがあるということでしょうか? 標準規格ができる前の古い処理系や、非標準処理系(つまり方言)の場合は何が起こっても不思議ではありません。 ちなみに、System.Bool云々の話はC++/CLI(これもある意味方言)と混同している可能性があるので鵜呑みにしないこと。
- osamuy
- ベストアンサー率42% (1231/2878)
> デバッガで見てみましたが、256を入れてもtrueになりました。 boolって、unsigined charだったはずと思ってたけど、Visual C++ 2008 Express Editionで試したら、System.Boolに変換されてました。 だめですね、昔の知識で回答しちゃ。
- jacta
- ベストアンサー率26% (845/3158)
> iの値が0以外ならaはtrueとなることは保証されるのでしょうか? 保証されます。
お礼
安心しました。 ありがとうございます。
- osamuy
- ベストアンサー率42% (1231/2878)
int i = 256; だと、falseになりそうな。
補足
ありがとうございます。 デバッガで見てみましたが、256を入れてもtrueになりました。 ひょっとして処理系依存でたまたまtrueになっているだけなのでしょうか。 falseになりそうな理由を教えてもらえないでしょうか?
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
僕なら素直に int i = 100; bool a = (i != 0);
お礼
ありがとうございます。 なるほど。そのやり方の方がいいですね。
- koko_u_
- ベストアンサー率18% (459/2509)
>このキャストを行うとき、iの値が0ならaはfalse, >iの値が0以外ならaはtrueとなることは保証されるのでしょうか? なるけど、その前に 100 を bool 型の変数に代入する必要が本当にあるのかを考え直した方がいい。
お礼
ありがとうございます。 おっしゃる通りです。
お礼
すみません。わからない点があるので聞かせてください。 おっしゃられているのは、処理系によってはboolの内部実装にunsigned charを使っていて、 256を入れるとオーバーフローして0になってしまうことがあるということでしょうか? これだと、bool型がもとからあるC++だと問題にはならないと思うのですが、 その認識であっていますでしょうか? それとも、Cにおいてbool型をみかけ上作るために、 typdef unsigned int bool; となっていることがたまにあり、その際にトラブルになるということでしょうか?