NSInteger和BOOL的底層型別

2021-08-21 21:19:40 字數 1594 閱讀 9390

在objective-c中,nsinteger和bool是通過typedef或者#define巨集進行定義的,那麼,這兩個資料型別的底層型別是什麼呢?

首先檢視nsinteger的定義:

#if __lp64__ || (target_os_embedded && !target_os_iphone) || target_os_win32 || ns_build_32_like_64typedef 

long

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 資料型別,可取值...