美文网首页
【OC梳理】基本数据类型和基本运算

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

作者: 忠橙_g | 来源:发表于2017-11-14 17:56 被阅读14次

    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 其余赋值运算符 左到右

    相关文章

      网友评论

          本文标题:【OC梳理】基本数据类型和基本运算

          本文链接:https://www.haomeiwen.com/subject/ksizmxtx.html