【IOS 开发】Objective - C 入门 之 数据类型详解(二)

简介: 【IOS 开发】Objective - C 入门 之 数据类型详解(二)

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 <Foundation/Foundation.h>

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 <Foundation/Foundation.h>

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 <Foundation/Foundation.h>

/* 判断 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 <Foundation/Foundation.h>

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

 


目录
相关文章
|
5天前
|
设计模式 前端开发 Swift
探索iOS开发:从初级到高级的旅程
【10月更文挑战第31天】在这篇文章中,我们将一起踏上iOS开发的旅程。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。我们将从基础开始,逐步深入到更高级的技术和概念。让我们一起探索iOS开发的世界吧!
|
8天前
|
设计模式 前端开发 Swift
探索iOS开发:从初级到高级的旅程
【10月更文挑战第28天】在这篇技术性文章中,我们将一起踏上一段探索iOS开发的旅程。无论你是刚入门的新手,还是希望提升技能的开发者,这篇文章都将为你提供宝贵的指导和灵感。我们将从基础概念开始,逐步深入到高级主题,如设计模式、性能优化等。通过阅读这篇文章,你将获得一个清晰的学习路径,帮助你在iOS开发领域不断成长。
34 2
|
13天前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
15天前
|
Swift iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】在苹果生态系统中,SwiftUI的引入无疑为iOS应用开发带来了革命性的变化。本文将通过深入浅出的方式,带领读者了解SwiftUI的基本概念、核心优势以及如何在实际项目中运用这一框架。我们将从一个简单的例子开始,逐步深入到更复杂的应用场景,让初学者能够快速上手,同时也为有经验的开发者提供一些深度使用的技巧和策略。
43 1
|
4天前
|
存储 数据可视化 Swift
探索iOS开发之旅:从新手到专家
【10月更文挑战第33天】在这篇文章中,我们将一起踏上一场激动人心的iOS开发之旅。无论你是刚刚入门的新手,还是已经有一定经验的开发者,这篇文章都将为你提供宝贵的知识和技能。我们将从基础的iOS开发概念开始,逐步深入到更复杂的主题,如用户界面设计、数据存储和网络编程等。通过阅读这篇文章,你将获得成为一名优秀iOS开发者所需的全面技能和知识。让我们一起开始吧!
|
5天前
|
移动开发 Java Android开发
探索Android与iOS开发的差异性与互联性
【10月更文挑战第32天】在移动开发的大潮中,Android和iOS两大平台各领风骚。本文将深入浅出地探讨这两个平台的开发差异,并通过实际代码示例,展示如何在各自平台上实现相似的功能。我们将从开发环境、编程语言、用户界面设计、性能优化等多个角度进行对比分析,旨在为开发者提供跨平台开发的实用指南。
25 0
|
1月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
C语言 iOS开发
【IOS 开发】Objective - C 入门 之 数据类型详解(一)
【IOS 开发】Objective - C 入门 之 数据类型详解(一)
201 0
|
6月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
381 2
|
4月前
|
开发工具 iOS开发 容器
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
iOS Objective-C 应用连接Azure Storage时,若不关闭账号的匿名访问,程序能正常运行。但关闭匿名访问后,上传到容器时会出现错误:“Public access is not permitted”。解决方法是将创建容器时的公共访问类型从`AZSContainerPublicAccessTypeContainer`改为`AZSContainerPublicAccessTypeOff`,以确保通过授权请求访问。
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错