2016-12-03 48 views
2

我發現爲什麼0xF00解釋爲NO,當十二月不爲0

BOOL x = (BOOL)0xF00; 

NO ...值0xF00不爲0,但仍然結果是NO

但這吹我的範例,布爾應該作爲

NO == 0, YES == any other value 

爲什麼這樣?是否表示檢查

if (object) {} 

是不是安全?

+0

'_Bool'這樣工作,但'BOOL'沒有。 –

+1

另請參閱:[「BOOL的尖角」在BNR博客上](https://www.bignerdranch.com/blog/bools-sharp-corners/) –

+0

此致,爲什麼蘋果三年前在iOS中修復了這個問題,但仍然沒有在MacOS中沒有做到這一點?這對我沒有意義。 – vitormm

回答

4

BOOL被定義爲8位的帶符號字符。但是0xF00需要多於8位。因此,編譯走的是最低的8位,這都爲0的值。當我嘗試它,編譯器特別警告這個問題:

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

如果你打算爲任意值賦值給變量BOOL,那麼你的範式就需要考慮價值如何表現。

+0

是否表示檢查'if(object){}'不安全? –

+1

如果你的意思是檢查'object'是否爲零,這是安全的,因爲'if'檢查的工作方式不同。儘管寫'if(object!= nil){}'仍然更清晰。 –

+0

以什麼方式,'if'的工作方式不同? –

1

投射到一個字節值截斷所有較高位......你可以做到這一點,但...

BOOL boolyValue = !!0xffff00;