在objective-c中,nsinteger和bool是通過typedef或者#define巨集進行定義的,那麼,這兩個資料型別的底層型別是什麼呢?
首先檢視nsinteger的定義:
#if __lp64__ || (target_os_embedded && !target_os_iphone) || target_os_win32 || ns_build_32_like_64typedeflong
nsinteger;
typedef unsigned
long
nsuinteger;
#else
typedef
intnsinteger;
typedef unsigned
intnsuinteger;
#endif
發現如果機器是lp64(mac os x和大於iphone5的機器,以及iphone se都是)的,那麼nsinteger就是long型別,佔64位,而如果是在32位機器(比如iphone5及以下機器)上nsinteger是int型別,佔32位
接下來檢視bool的定義:
///type to represent a boolean value.
#if (target_os_iphone && __lp64__) || target_os_watch
#define objc_bool_is_bool 1typedef
bool
bool;
#else
#define objc_bool_is_char 1typedef signed
char
bool;
//bool is explicitly signed so @encode(bool) == "c" rather than "c"
//even if -funsigned-char is used.
#endif
可以發現,在ios平台和os x平台上,bool的定義是不一樣的。在ios平台上,bool型別是bool,下面是bool的定義:
#define bool _bool
_bool型別是c99引入的新型別,用來表示布林型別,c99沒有規定_bool具體佔多少位,只要求至少可以表示0和1,並且還規定,任何非零的數賦給_bool型別都會轉化位1,表示真,0賦給_bool型別表示假。通過在ios平台上輸出sizeof(bool)可以發現bool型別佔8位。而在os x平台上,bool型別是signed char型別,同樣佔8位。
雖然在os x和ios上bool型別都占用8位,但是由於底層的資料型別不一樣,因此,在使用時也會有些區別。在os x平台上,由於bool實際上是signed char,因此將乙個大於8位表示的數賦值給bool型別是,bool型別只保留該數的低8位,所以,如果將258賦值給乙個bool型別,那麼這個bool型別的值為2,並且此時該bool型別的值不等於yes(雖然bool型別此時為2是非零的,應該是真,但是由於yes定義為1,因此,此時兩者不等);而在ios平台上不一樣,由於任何非零值賦給bool型別都會轉成1,因此,將258賦給bool型別時,該boo型別的值為1,並且等於yes。
iOS int和NSInteger的區別
查到c語言中,int和long的位元組數數是和作業系統指標所佔位數相同。但c語言中,long的長度永遠大於或等於int object c裡,蘋果的官方文件中總是推薦nsinteger if lp64 target os embedded target os iphone target os win3...
BOOL和bool的區別
bool和bool的區別 1 型別不同 bool為int型 bool為布林型 2 長度不同 bool只有乙個位元組 bool長度視實際環境來定,一般可認為是4個位元組 3 取值不同 bool取值false和true,是0和1的區別 bool取值false和true,是0和非0的區別而bool是標準c...
BOOL和bool的區別
一 1 型別不同 bool為int型 bool為布林型 2 長度不同 bool只有乙個位元組 bool長度視實際環境來定,一般可認為是4個位元組 3 取值不同 bool取值false和true,是0和1的區別 bool取值false和true,是0和非0的區別 二 bool是標準c 資料型別,可取值...