• 締切済み

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となることは保証されるのでしょうか? よろしくお願いいたします。

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

横槍ですが... > 処理系によってはboolの内部実装にunsigned charを使っていて、 > 256を入れるとオーバーフローして0になってしまうことがあるということでしょうか? 標準規格ができる前の古い処理系や、非標準処理系(つまり方言)の場合は何が起こっても不思議ではありません。 ちなみに、System.Bool云々の話はC++/CLI(これもある意味方言)と混同している可能性があるので鵜呑みにしないこと。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.5

> デバッガで見てみましたが、256を入れてもtrueになりました。 boolって、unsigined charだったはずと思ってたけど、Visual C++ 2008 Express Editionで試したら、System.Boolに変換されてました。 だめですね、昔の知識で回答しちゃ。

rotofrot
質問者

お礼

すみません。わからない点があるので聞かせてください。 おっしゃられているのは、処理系によってはboolの内部実装にunsigned charを使っていて、 256を入れるとオーバーフローして0になってしまうことがあるということでしょうか? これだと、bool型がもとからあるC++だと問題にはならないと思うのですが、 その認識であっていますでしょうか? それとも、Cにおいてbool型をみかけ上作るために、 typdef unsigned int bool; となっていることがたまにあり、その際にトラブルになるということでしょうか?

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> iの値が0以外ならaはtrueとなることは保証されるのでしょうか? 保証されます。

rotofrot
質問者

お礼

安心しました。 ありがとうございます。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

int i = 256; だと、falseになりそうな。

rotofrot
質問者

補足

ありがとうございます。 デバッガで見てみましたが、256を入れてもtrueになりました。 ひょっとして処理系依存でたまたまtrueになっているだけなのでしょうか。 falseになりそうな理由を教えてもらえないでしょうか?

回答No.2

僕なら素直に int i = 100; bool a = (i != 0);

rotofrot
質問者

お礼

ありがとうございます。 なるほど。そのやり方の方がいいですね。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>このキャストを行うとき、iの値が0ならaはfalse, >iの値が0以外ならaはtrueとなることは保証されるのでしょうか? なるけど、その前に 100 を bool 型の変数に代入する必要が本当にあるのかを考え直した方がいい。

rotofrot
質問者

お礼

ありがとうございます。 おっしゃる通りです。

関連するQ&A