【IOS 开发】 数据类型详解

1. 数据类型简介及输出

(1) 数据类型简介

数据类型简介: Object - C 数据类型 分为 基本数据类型, 构造类型 和 指针类型;

--基本数据类型: 整型, 字符型, 浮点型 (float 和 double), 枚举型;

--构造类型: 数组类型, 结构体类型, 共用体类型;

--指针类型: 最终要的数据类型,所有的系统类, 自定义类都是指针;

--空类型: 空类型只有一个值 nil, 该类型没有名称, 因此没有空类型的变量, 变量不能转换成空类型, 但是空类型可以转换成任何引用类型;

(2) 数据类型输出

NSLog()简介: NSLog 是 Foundation 框架中功能强大的函数, 可以输出任何类型的数据;

--占位符: NSLog() 函数中各式与 C 语言中大致相似, 第一个参数是加了 @ 的字符串, 后面的参数是用于替换占位符的;

整型占位符说明:

--%d: 十进制整数, 正数无符号, 负数有 "-" 符号;

--%o: 八进制无符号整数, 没有 0 前缀;

--%x: 十六进制无符号整数, 没有 0x 前缀;

--%u: 十进制无符号整数;

字符占位符说明:

--%c: 单个字符输出;

--%s: 输出字符串;

浮点占位符说明:

--%f: 以小数形式输出浮点数, 默认 6 位小数;

--%e: 以指数形式输出浮点数, 默认 6 位小数;

--%g: 自动选择 %e 或者 %f 各式;

其它形式占位符:

--%p: 输出十六进制形式的指针地址;

--%@: 输出 Object-C 对象;

占位符附加字符:

--l: 在整型 和 浮点型占位符之前, %d %o %x %u %f %e %g 代表长整型 和 长字符串;

--n(任意整数): %8d 代表输出8位数字, 输出总位数;

--.n: 浮点数限制小数位数, %5.2f 表示 5位数字 2位小数, 字符串截取字符个数;

---: 字符左对齐;

示例代码:

#import

int main(int argc, char **argv)

{

@autoreleasepool{

int a = 38;

long b = 38;

double c = 3.8;

double d = 2.3;

char * oct_c = "Octopus";

NSString *oct_oc = @"Octopus"; /* 定义字符串, 在字符串前加上 @ 说明是Ovject-C变量, 值赋给一个 NSString 指针 */

NSDate *date = [[NSDate alloc]init];

NSLog(@"%d 十进制整型", a);

NSLog(@"%5d 五位十进制整型", a);

NSLog(@"%-5d 左对齐的五位十进制整型", a);

NSLog(@"%o 八进制整型", a);

NSLog(@"%x 十六进制整型\n", a);

NSLog(@"%ld 长整型", b);

NSLog(@"%lx 十六进制长整型\n", b);

NSLog(@"%f 小数形式输出浮点数", c);

NSLog(@"%e 指数形式输出浮点数", c);

NSLog(@"%g 以最简短形式输出浮点数", c);

NSLog(@"%5f 以五位小数形式输出浮点数", c);

NSLog(@"%5.3f 小数行书输出, 一共五位, 小数3位\n", c);

NSLog(@"%lf 小数形式输出长浮点数", d);

NSLog(@"%le 指数形式输出长浮点数", d);

NSLog(@"%lg 以最短形式输出长浮点数", d);

NSLog(@"%5lf 5位小数形式输出长浮点数", d);

NSLog(@"%5.3lf 5位小数形式输出长浮点数, 其中3位是小数\n", d);

NSLog(@"%s 输出C字符串", oct_c);

NSLog(@"%@ 输出Object-C字符串\n", oct_oc);

NSLog(@"%@ 输出日期", date);

}

}

执行结果:

octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 02-NSLogDemo.m

octopus-2:ios octopus$

octopus-2:ios octopus$ ./a.out

2014-08-16 19:32:44.210 a.out[1300:507] 38 十进制整型

2014-08-16 19:32:44.212 a.out[1300:507]    38 五位十进制整型

2014-08-16 19:32:44.213 a.out[1300:507] 38    左对齐的五位十进制整型

2014-08-16 19:32:44.214 a.out[1300:507] 46 八进制整型

2014-08-16 19:32:44.214 a.out[1300:507] 26 十六进制整型

2014-08-16 19:32:44.215 a.out[1300:507] 38 长整型

2014-08-16 19:32:44.215 a.out[1300:507] 26 十六进制长整型

2014-08-16 19:32:44.216 a.out[1300:507] 3.800000 小数形式输出浮点数

2014-08-16 19:32:44.216 a.out[1300:507] 3.800000e+00 指数形式输出浮点数

2014-08-16 19:32:44.217 a.out[1300:507] 3.8 以最简短形式输出浮点数

2014-08-16 19:32:44.217 a.out[1300:507] 3.800000 以五位小数形式输出浮点数

2014-08-16 19:32:44.218 a.out[1300:507] 3.800 小数行书输出, 一共五位, 小数3位

2014-08-16 19:32:44.218 a.out[1300:507] 2.300000 小数形式输出长浮点数

2014-08-16 19:32:44.219 a.out[1300:507] 2.300000e+00 指数形式输出长浮点数

2014-08-16 19:32:44.219 a.out[1300:507] 2.3 以最短形式输出长浮点数

2014-08-16 19:32:44.219 a.out[1300:507] 2.300000 5位小数形式输出长浮点数

2014-08-16 19:32:44.220 a.out[1300:507] 2.300 5位小数形式输出长浮点数, 其中3位是小数

2014-08-16 19:32:44.220 a.out[1300:507] Octopus 输出C字符串

2014-08-16 19:32:44.220 a.out[1300:507] Octopus 输出Object-C字符串

2014-08-16 19:32:44.226 a.out[1300:507] 2014-08-16 11:32:44 +0000 输出日期

2. 整型

(1) 整型类型介绍

四种整型:

--short int: 短整型, 占16位, mac 上占 2 字节, ios 上占 2 字节, 范围 -32768(-2^15) ~ 32767(2^15 - 1), 3万;

--int: 整型, 占32位, mac 上占 4 字节, ios 上占 4 字节, 范围 -2147483648(-2^31) ~ 2147483647(2^31 - 1), 21亿;

--long int: 长整型, 占64位, mac 上占 8 字节, ios 上占 4 字节, (-2^63) ~ (2^63 - 1), 922亿亿;

--long long: 占64位, mac 上占 8 字节, ios 上占 8 字节;

整数赋值: 整型赋值时注意范围, 如果超出赋值范围, 会出现警告, 数据也会丢失;

--示例程序:

/*************************************************************************

> File Name: a.m

> Author: octopus

> Mail: octopus_truth.163.com

> Created Time: 日  8/17 00:44:19 2014

************************************************************************/

#import

int main(int argc, char * argv[])

{

@autoreleasepool {

short int a = 50000; /* short int 范围是 正负3万, 因此超出范围报错 */

int a = 50000;

NSLog(@"short int a = %d", a);

NSLog(@"int a = %d", a);

}

}

--执行结果:

octopus-2:~ octopus$ clang -fobjc-arc -framework Foundation a.m

a.m:14:7: error: redefinition of 'a' with a different type: 'int' vs 'short'

int a = 50000;

^

a.m:13:13: note: previous definition is here

short int a = 50000;

^

1 error generated.

(2) 进制介绍

八进制 十六进制赋值: 八进制由 "0" 开头, 十六进制由 "0x" 或者 "0X" 开头;

--示例程序:

#import

int main(int argc, char **argv)

{

@autoreleasepool

{

int a = 010; /* 八进制赋值 */

int b = 0x10; /* 十六进制赋值 */

int c = 10; /* 正常十进制赋值 */

NSLog(@"a = %d", a);

NSLog(@"b = %d", b);

NSLog(@"c = %d", c);

NSLog(@". . . . . ");

NSLog(@"a = %o", a);

NSLog(@"b = %x", b);

}

return 0;

}

--执行结果:

octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 03-IntDemo1.m

octopus-2:ios octopus$ ./a.out

2014-08-17 00:58:50.513 a.out[1726:507] a = 8

2014-08-17 00:58:50.516 a.out[1726:507] b = 16

2014-08-17 00:58:50.516 a.out[1726:507] c = 10

2014-08-17 00:58:50.516 a.out[1726:507] . . . . .

2014-08-17 00:58:50.517 a.out[1726:507] a = 10

2014-08-17 00:58:50.517 a.out[1726:507] b = 10

(3) 无符号整型

无符号整型: 无符号整型 第一位 不是符号位, 范围比原来要大, 例如 short int 范围是 正负3万, unsigned short int 范围是 0到6万, 将5万赋值给 该类型不报错;

--示例程序:

/*************************************************************************

> File Name: 03-IntDemo2.m

> Author: octopus

> Mail: octopus_truth.163.com

> Created Time: 日  8/17 01:02:39 2014

************************************************************************/

#import

int main(int argc, char * argv[])

{

@autoreleasepool {

unsigned short int a = 50000;

NSLog(@"a = %d", a);

}

}

--执行结果:

octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 03-IntDemo2.m

octopus-2:ios octopus$ ./a.out

2014-08-17 01:03:35.508 a.out[1745:507] a = 50000

3. 字符型

字符型数据简介:

--单个字符表示: 使用 '' 将单个字符引起来, 便是字符常量, 如 'a', 'b' 等;

--转义字符表示: 使用转义符号 \ 来指定字符, 如 '\n' 等;

--字符占用空间大小: 每个字符占用一个字节, 因此 Object-C 不支持中文字符, 因为中文字符都是占 2 ~ 3 个字节;

转义字符: 分为特殊空白字符 和 区别 单双引号 和 反斜线的转义;

--退格符: '\b' ;

--换行符: '\n' ;

--回车符: '\r' ;

--制表符: '\t' ;

--双引号: '\"' ;

--单引号: '\'' ;

--反斜线: '\\' ;

int 与 char 类型关系:char 类型可以当做 8 位无符号整数, 取值范围 0 ~ 255;

--int 赋值给 char: 将 int 类型赋值给 char 变量的时候, 会自动将类型转为 char 类型;

char 类型 示例:

/*************************************************************************

> File Name: 05-charDemo.m

> Author: octopus

> Mail: octopus_truth.163.com

> Created Time: 二  8/19 21:10:37 2014

************************************************************************/

#import

int main(int argc, char * argv[])

{

@autoreleasepool {

char a = 'a';

char b = 100;

char c = '\n';

NSLog(@"a = %d", a);

NSLog(@"b = %c", b);

NSLog(@"c = %d", c);

}

}

执行结果:

octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 05-charDemo.m

octopus-2:ios octopus$ ./a.out

2014-08-19 21:13:24.815 a.out[441:507] a = 97

2014-08-19 21:13:24.816 a.out[441:507] b = d

2014-08-19 21:13:24.817 a.out[441:507] c = 10

4. 浮点型

浮点型数据类型:

--float: 占 4 字节;

--double: 占 8 字节;

--long double: 占 16 字节;

浮点数表示形式:

--十进制形式: 简单的浮点数, 包含一个小数点, 如 3.8, 38.0, .38 等;

--科学计数法: 3.8E2 或者 3.8e2 代表 3.8*10^2, 只有浮点数才能使用科学计数法;

Object-C 与 Java 浮点数区别:

--Java 浮点数: Java 的 double 与 float 不同, 浮点数赋值给 float 需要加上 f 后缀;

--Object-C浮点数: 不区分 double 与 float, 一个浮点数 3.8 可以赋值给两种类型的变量;

浮点数的特殊值:

--正无穷大: 正浮点数除以 0.0 得到正无穷大, 正无穷大都相等, 正整数除以 0.0 得到整数的边界值, short int 除以 0.0 得到 32767(2^15 -1);

--负无穷大: 负浮点数除以 0.0 得到负无穷大, 负无穷大都相等, 负整数除以 0.0 得到整数的边界值, short int 除以 0.0 得到 -32768(2^15);

--非数: 0.0 除以 0.0 得到一个非数, 非数与任何数包括其本身都不相等;

代码示例:

/*************************************************************************

> File Name: 06-floatDemo.m

> Author: octopus

> Mail: octopus_truth.163.com

> Created Time: 三  8/20 01:08:35 2014

************************************************************************/

#import

int main(int argc, char * argv[])

{

@autoreleasepool {

/* 定义的10位的小数, 使用10位 %g 格式输出, 结果 float 只能接收6位小数 */

float a = 3.888888888;

NSLog(@"a = %10g", a);

/* double 类型也只能接收6位有效值 */

double b = 388.8888888;

NSLog(@"b = %10g", b);

NSLog(@"5.0 / 0.0 = %g", 5.0 / 0.0);

NSLog(@"正无穷大对比结果 = %d", 5.0/0.0 == 500/0.0);

double feiNum = 0.0 / 0.0;

NSLog(@"0.0 / 0.0 = %g", feiNum);

NSLog(@"非数对比结果 = %d", feiNum == feiNum);

/* 获取边界 */

int bound1 = 5/0.0;

int bound2 = -5/0.0;

NSLog(@"正边界 = %d, 负边界 = %d", bound1, bound2);

}

}

--执行效果:

octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 06-floatDemo.m

octopus-2:ios octopus$ ./a.out

2014-08-20 01:22:22.712 a.out[776:507] a =    3.88889

2014-08-20 01:22:22.714 a.out[776:507] b =    388.889

2014-08-20 01:22:22.714 a.out[776:507] 5.0 / 0.0 = inf

2014-08-20 01:22:22.714 a.out[776:507] 正无穷大对比结果 = 1

2014-08-20 01:22:22.715 a.out[776:507] 0.0 / 0.0 = nan

2014-08-20 01:22:22.715 a.out[776:507] 非数对比结果 = 0

2014-08-20 01:22:22.715 a.out[776:507] 正边界 = 2147483647, 负边界 = -2147483648

--注意情况: 不能将 5/0.0 直接以 %d 形式打印, 否则会报以下错误;

octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 06-floatDemo.m

06-floatDemo.m:29:44: warning: format specifies type 'int' but the argument has type 'double' [-Wformat]

NSLog(@"正边界 = %d, 负边界 = %d", 5/0.0, -5/0.0);

~~                ^~~~~

%f

06-floatDemo.m:29:51: warning: format specifies type 'int' but the argument has type 'double' [-Wformat]

NSLog(@"正边界 = %d, 负边界 = %d", 5/0.0, -5/0.0);

~~          ^~~~~~

%f

2 warnings generated.

5. 枚举类型

(1) 定义普通枚举

定义方式: 格式enum enum_name {elem1, elem2, elem3 ...};

--示例: enum day{Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};

定义枚举变量: 格式enum enum_name var1, var2;

--示例: enum day today, tomorrow, 注意 today tomorrow 两个变量的取值只能是 day 枚举中定义的值;

枚举变量赋值: 格式variable = elm1;

--示例: today = Sunday; tomorrow = Friday;

(2) 定义匿名枚举

匿名枚举格式: enum{Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday} today, tomorrow ;

--说明: 两个枚举变量 today 和 tomorrow 只能取值 enum 中得枚举值;

(3) 枚举值简介

枚举值常量: 在 {} 中得是枚举常量 或者 枚举元素, 该元素不是变量, 不能对齐进行赋值, 枚举的值按照定义的顺序 0, 1, 2, 3 以此类推;

枚举值本质: 枚举值属于无符号整数, 可以使用 %u 占位符打印出来, 其值也能进行大小比较, 和四则运算;

枚举初值: 枚举值可以在定义的时候赋予一个初值;

(4) 枚举示例

示例程序:

/*************************************************************************

> File Name: 07-enumDemo.m

> Author: octopus

> Mail: octopus_truth.163.com

> Created Time: 四  8/21 21:36:09 2014

************************************************************************/

#import

int main(int argc, char * argv[])

{

@autoreleasepool {

/* 定义一个枚举 */

enum day {Sunday = 6, Monday = 2, Tuesday, Wednesday, Thursday, Friday, Saturday};

/* 定义枚举变量 */

enum day today, tomorrow;

/* 为枚举变量赋值 */

today = Wednesday;

tomorrow = Thursday;

/* 打印枚举值 */

NSLog(@"today = %u", today);

NSLog(@"tomorrow = %u", tomorrow);

enum {alive, die} state;

state = alive;

NSLog(@"state = %d",  state);

}

}

执行结果:

octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 07-enumDemo.m

octopus-2:ios octopus$ ./a.out

2014-08-21 21:49:01.414 a.out[664:507] today = 4

2014-08-21 21:49:01.416 a.out[664:507] tomorrow = 5

2014-08-21 21:49:01.416 a.out[664:507] state = 0

6. 布尔型数据

BOOL 类型简介:

--BOOL 类型值: 该类型至右两个值 YES 和 NO ;

--BOOL 类型本质: 该类型本质是 signed char,YES 是 1,NO 是 0, 在处理的时候YES 会被当成真处理,NO 会被当成假处理;

定义 BOOL 类型的系统源码:

#define OBJC_BOOL_DEFINED

/// Type to represent a boolean value.

typedef signed char BOOL;

// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"

// even if -funsigned-char is used.

#if __has_feature(objc_bool)

#define YES            __objc_yes

#define NO              __objc_no

#else

#define YES            ((BOOL)1)

#define NO              ((BOOL)0)

#endif

代码示例:

/*************************************************************************

> File Name: 08-boolDemo.m

> Author: octopus

> Mail: octopus_truth.163.com

> Created Time: 二  8/26 00:29:58 2014

************************************************************************/

#import

/* 判断 a 是否大于 b */

BOOL isBig(int a, int b)

{

if(a > b)

{

return YES;

}

return NO;

}

int main(int argc, char * argv[])

{

@autoreleasepool {

int a = 5;

int b = 3;

NSLog(@"a 是否大于 b : %d", isBig(a, b));

BOOL c = 1;

BOOL d = 2;

NSLog(@"c = %d", c);

NSLog(@"d = %d", d);

}

}

执行结果:

octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 08-boolDemo.m

octopus-2:ios octopus$ ./a.out

2014-08-26 00:40:48.928 a.out[1758:507] a 是否大于 b : 1

2014-08-26 00:40:48.930 a.out[1758:507] c = 1

2014-08-26 00:40:48.931 a.out[1758:507] d = 2

BOOL 类型赋值:

--BOOL 类型判断: BOOL 类型会将非 0 数字当做 YES 处理;

--大数字赋值: 注意 BOOL 类型只有 8 位, 赋值的时候, 只要最后8位不为0, 那么 BOOL 类型就是 YES, 如果后 8 位为0, 那么 BOOL 为 NO;

--示例代码:

/*************************************************************************

> File Name: 08-boolDemo1.m

> Author: octopus

> Mail: octopus_truth.163.com

> Created Time: 二  8/26 00:48:05 2014

************************************************************************/

#import

int main(int argc, char * argv[])

{

@autoreleasepool {

BOOL a = 256;

BOOL b = 512;

NSLog(@"a = %d", a);

NSLog(@"b = %d", b);

}

}

--编译警告:

octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 08-boolDemo1.m

08-boolDemo1.m:13:12: warning: implicit conversion from 'int' to 'BOOL' (aka 'signed char') changes value from 256 to 0

[-Wconstant-conversion]

BOOL a = 256;

~  ^~~

08-boolDemo1.m:14:12: warning: implicit conversion from 'int' to 'BOOL' (aka 'signed char') changes value from 512 to 0

[-Wconstant-conversion]

BOOL b = 512;

~  ^~~

2 warnings generated.

--执行结果:

octopus-2:ios octopus$ ./a.out

2014-08-26 00:50:00.705 a.out[1802:507] a = 0

2014-08-26 00:50:00.708 a.out[1802:507] b = 0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容