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
NSInteger和BOOL的底层类型的更多相关文章
- 2016年11月3日JS脚本简介数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6.布尔型数据:bool 7.对象类型:object 8.二进制:binary 语言类型: 1.强类型语言:c++ c c# java 2.弱类型语
数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6 ...
- delphi编程里的bool跟boolean类型有什么区别
bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- C语言中有bool类型吗?
之前一直都没有注意到,最近在用C语言写DSP算法时,偶然间发现我函数中定义的bool类型的变量在VC6.0(我主要用它来检查一下语法错误)中编译居然报错了,说是bool类型没有定义.用了这么久的C和C ...
- bool和BOOL类型知识集合
知识点一.C语言中有bool类型吗? 转自http://blog.csdn.net/liuqiqi677/article/details/6703615 之前一直都没有注意到,最近在用C语言写DSP算 ...
- Dart语言学习(五)Dart Bool类型
Dart Bool类型和其他语言类似,比较简单 其特点有: 1.使用 bool 表示布尔类型 2.布尔值只有 true 和 false 3.布尔类型bool默认值是null bool isTrue = ...
- golang: 常用数据类型底层结构分析
虽然golang是用C实现的,并且被称为下一代的C语言,但是golang跟C的差别还是很大的.它定义了一套很丰富的数据类型及数据结构,这些类型和结构或者是直接映射为C的数据类型,或者是用C struc ...
- PHP 底层的运行机制与原理
PHP说简单,但是要精通也不是一件简单的事.我们除了会使用之外,还得知道它底层的工作原理. PHP是一种适用于web开发的动态语言.具体点说,就是一个用C语言实现包含大量组件的软件框架.更狭义点看,可 ...
- PHP的运行机制与原理(底层) [转]
说到php的运行机制还要先给大家介绍php的模块,PHP总共有三个模块:内核.Zend引擎.以及扩展层:PHP内核用来处理请求.文件流.错误处理等相关操作:Zend引擎(ZE)用以将源文件转换成机器语 ...
随机推荐
- 慕课Linux学习笔记(三)系统分区
Linux的系统分区 主分区:最多四个 扩展分区:最多只能一个,不能写入数据,只能包含逻辑分区 逻辑分区 必须分区: / (根分区) Swap 分区 (交换分区,内存的两倍,不超过2GB,如果内存大于 ...
- js借用和绑定
var one = { name:"object", say:function(greet) { return greet + ","+this.name; } ...
- Gizmos绘制塔防游戏网格
1.画线脚本写法及地面调整 首先,新建脚本GridMap 新建绘制网格方法(初始数值为10*10) 在类中创建变量 //定义地图宽度 public int m_mapWidth = 10; //地图高 ...
- IOS开发笔记(4)数据离线缓存与读取
IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...
- UIAppearance使用详解-备
iOS5及其以后提供了一个比较强大的工具UIAppearance,我们通过UIAppearance设置一些UI的全局效果,这样就可以很方便的实现UI的自定义效果又能最简单的实现统一界面风格,它提供如下 ...
- 类XX是公共的,应在名为XX.java的文件中声明public class XX
找了一个程序粘贴到txt文档中,随便起个名为abc,然后改后缀为.java,接下来在dos中运行时出现以上错误 打开abc.java看了看,声明public class了,但是名字是粘贴过来的类名Wo ...
- 如何查看linux版本
1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux version 2.6.9-22.ELsmp (bhcompile@crowe ...
- 设置ActioinBar 的背景色以及Title的字体颜色
//设置ActionBar背景 Drawable draw=this.getResources().getDrawable(R.drawable.actionbar_bg); getActionBar ...
- 【转】SecureCRT 实用配置----不错
原文网址:http://blog.csdn.net/ithomer/article/details/9503123 SecureCRT,是一款支持 SSH2.SSH1.Telnet.Telnet/SS ...
- 制作安装包工具NSIS
NSIS 下载地址: http://nsis.sourceforge.net/Download 编辑工具:NIS Edit 下载地址: http://soft.hao123.com/soft/appi ...