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