【OC梳理】基本数据类型和基本运算

Objective-C作为以C语言为基础的语言,其基本数据类型与C语言类似。

1.基本数据类型

基本数据类型可以参考这篇文章OC:基本数据类型
文中介绍了int 、float 、double 、char 的信息。
OC中,常用还有NSInteger,CGFloat,NSString,以及布尔类型。

NSInteger

以下是NSInteger的定义代码:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

从代码中,可以看到,在32位和64位系统中,NSInteger的定义为int和long。
在使用过程中,常常会在字符串中拼接某个NSInteger变量,此时如果用%d,那么在64位的编译环境下会有警告提示,如果改成%ld,那么在32位的环境下会有警告提示。
解决的办法是将NSInteger转换为long,使用%ld。

CGFloat

以下是CGFloat的定义代码:

#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
#else
# define CGFLOAT_TYPE float
#endif
typedef CGFLOAT_TYPE CGFloat;

从代码中,可以看到,在32位和64位系统中,CGFloat的定义为float和double。

布尔类型

OC中,布尔类型有四种bool、BOOL、Boolean、boolean_t。
表面上看好像都是布尔类型的数据,其实有一些区别:

bool

bool 的定义如下:

#define _Bool bool

_Bool类型是C99引入的新类型,用来表示布尔类型,C99没有规定_Bool具体占多少位,只要求至少可以表示0和1,并且还规定,任何非零的数赋给_Bool类型都会转化位1,表示真,0赋给_Bool类型表示假。
所以bool为0时其值为false;
任何非零的数赋给bool类型都会转化为1,即true。

BOOL

BOOL和bool稍有不同,以下是它的定义代码:

#if OBJC_BOOL_IS_BOOL
    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

代码中,OBJC_BOOL_IS_BOOL值在iOS平台上为1。
可以发现,在iOS平台和OS X平台上,BOOL的定义分别是bool和signed char。
bool与signed char有什么区别呢?
bool由于定义的原因非0即1;
而signed char的取值范围为-128 ~ 127,因此如果将大于8位数的值赋予signed char,只会截取后8位,那么 后7位的值如果为0(1位符号位) ,signed char的值就为0,否则为1。如:将128(10000000)、256(100000000)、512(1000000000)等等赋予signed char,其值为0。
所以,在OS X平台中,如果运行以下代码:

    BOOL i = 128;
    if (i == YES) {
        NSLog(@"YES");
    }else
    if (i == NO) {
        NSLog(@"NO");
    }else{
        NSLog(@"Other");
    }

其输出的结果为Other(只要是非0和1的情况 都是输出Other)。可以看到,如果在OS X平台中使用BOOL类型应避免与真值YES直接比较,避免得到错误的结果。

Boolean

Boolean的定义代码为:

typedef unsigned char Boolean;

其定义为unsigned char(取值范围0-255),有着与signed char的特点,因此同样应避免使用Boolean与真值YES直接比较。

boolean_t

boolean_t的定义代码为:

#if defined(__x86_64__) && !defined(KERNEL)
typedef unsigned int    boolean_t;
#else
typedef int     boolean_t;
#endif

可以看到是int/unsigned int类型,同样应避免使用Boolean与真值YES直接比较。

2.基本运算

位运算符

Objective-C支持的位运算符有6个:

& :按位与(同 1 才为 1,其余为 0,如 00011001&10011000 = 00011000)
| :按位或(同 0 才为 0,其余为 1,如 00011001 | 10011000 = 10011001)
~ :按位非(按位取反,如 ~00000001 = 11111110)
^ :按位异或(不同为1,相同为0,如 00011001 ^ 10011000 = 10000001)
<<:左位移运算符(转为二进制后左移,如11001 << 4 = 110010000,实际上相当于乘上2的4次方)
>>:右位移运算符(转为二进制后右移(去掉多余位),如110011111 >> 4 = 11001,实际上相当于除于2的4次方(取整))

算术运算符

Objective-C支持所有的基本算数运算符,+、-、*、/、++、--、%,用法和C语言一样。
+=:如 x += y,对应 x = x + y。还有其他九种以此类推。
-= 、 *= 、 /= 、 %= \ &= 、= 、 ^= 、 <<= 、 >>=。

比较运算符

大于:> 、大于等于:>=、小于:<、小于等于:<=、等于:==、不等于:!=

逻辑运算符

&&(与)、||(或)、!(非)、^(异或)

三目运算符

表达式1 ? 表达式2 : 表达式3

如果表达式1成立运行表达式2,否则运行表达式3.

运算符的优先级

优先级 运算符 结合方向
1 []、() 左到右
2 -(取负)、~(位非)、++、--、*(指针变量)、&(取地址)、强制类型转换、sizeof() 右到左
3 /、*、 % 左到右
4 +、- 左到右
5 <<、>> 左到右
6 >、>=、<、<= 左到右
7 ==、!= 左到右
8 &(位与) 左到右
9 ^(位异或) 左到右
10 I(位或) 左到右
11 &&(逻辑与) 左到右
12 II(逻辑或) 左到右
13 ?:(三目运算) 左到右
14 其余赋值运算符 左到右
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容