NSInteger和BOOL的底层类型

   在Objective-C中,NSInteger和BOOL是通过typedef或者#define宏进行定义的,那么,这两个数据类型的底层类型是什么呢?

   首先查看NSInteger的定义:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#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 1
typedef bool BOOL;
#else
#define OBJC_BOOL_IS_CHAR 1
typedef 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。

 

参考链接:

http://developer.51cto.com/art/201312/420153.htm

posted @   chaoguo1234  阅读(1728)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2013-03-22 创建可执行的JAR文件
点击右上角即可分享
微信分享提示