2016-12-03 3 views
2

ないとき、私はなぜ0xF00は、12月は0

BOOL x = (BOOL)0xF00; 

0xF00が非ゼロである... NOであるが、それでも結果はNO

が、これであることを発見NO、と解釈されます私のパラダイムを吹き飛ばして、BOOLはうまくいくはずです

NO == 0, YES == any other value 

なぜそれはそうですか?そのことを意味するのですか?

if (object) {} 

は安全ではありませんか?

+0

'_Bool'はそのように動作しますが、' BOOL'にはありません。 –

+1

も参照してください:[BNRのブログのBOOLのシャープコーナー](https://www.bignerdranch.com/blog/bools-sharp-corners/) –

+0

アップルはなぜ3年前にiOSでそれを修正したのですか?それはMacOSでやったの?それは私には意味がありません。 – vitormm

答えて

4

BOOLは8ビットの符号付き文字として定義されています。しかし、0xF00には8ビット以上が必要です。だから、コンパイラは、私はそれをしようとすると、0の値を持つ下位8ビットを、取っている、コンパイラは、特にこの問題について警告:

warning: implicit conversion from 'int' to 'BOOL' (aka 'signed char') changes value from 3840 to 0 [-Wconstant-conversion] 

あなたはBOOL変数に任意の値を代入するつもりなら、どのように値が表現されるかを説明する必要性についてのあなたのパラダイム。 1つのバイト値へのキャスト

+0

'if(object){}'のチェックが安全でないことを意味しますか? –

+1

'if'チェックが異なって動作するので、' object'がnilかどうかチェックすることは安全です。 if(object!= nil){}を書いた方がはっきりしています。どのような方法で –

+0

、 'if'は異なった働きをしますか? –

1

は、すべての上位ビットを切り捨て...あなたはこのかかわらを行うことができます...

BOOL boolyValue = !!0xffff00; 
関連する問題