你已经遇到过Objective-C的基本数据类型int。回顾一下,声明为int类型的变量只能用于保存整型值,也就是不包含小数位数的值。
Objective-C还提供了另外3种基本数据类型:float、double和char。声明为float类型的变量可以存储浮点数(即包含小数位数的值)。double类型和float类型一样,通常,前者表示的范围大约是后者的两倍。char数据类型可存储单个字符,例如字母a、数字字符6或者一个分号(后面将详细讨论有关内容)。
在Objective-C中,任何数字、单个字符或者字符串通常都称为常量。例如,数字58表示一个常量整数值,字符串@"Programming in Objective-C is fun."表示一个常量字符串对象。完全由常量值组成的表达式叫做常量表达式。因此,下面的表达式是一个常量表达式,因为该表达式的每一项都是常量值:
128 + 7 - 17
然而,如果将i声明为整型变量,那么表达式就不是一个常量表达式:
128 + 7 – i
int类型
整数常量由一个或多个数字的序列组成。序列前的负号表示该值是一个负数。值158、-10和0都是合法的整数常量。数字中间不允许插入空格,并且不能使用逗号(因此,12,000是一个非法的整数常量,它必须写成12000)。
每个值无论是字符、整数还是浮点数字,都有与其对应的值域。这个值域与系统为特定类型的值分配的内存量有关。一般来说,在语言中没有规定这个量,它通常依赖于所运行的计算机,因此,叫做设备或机器相关量。例如,一个整数可在计算机上占用32位,或者可以使用64位存储。如果使用64位存储,整型变量将能够存储比32位更大的数值。
 
注意
在Mac OS X中,提供了选择应用程序是在32位还是64位下编译。在前一种情况下,一个int占用32位;在后一种情况下,一个int占用64位。
float类型
声明为float类型的变量可以存储包含小数位的值。要区分浮点常量,可以看它是否包含小数点。值3.、125.8及 -.0001都是合法的浮点常量。要显示浮点值,可用NSLog转换字符%f或者%g。
浮点常量也能用所谓的科学计数法来表示。值1.7e4就是使用这种计数法来表示的浮点值,它表示值1.7×10 4
如上所述,double类型与float类型非常相似,只是double类型的变量可存储的范围大概是float变量的两倍。
char类型
char变量可存储单个字符。将字符放入一对单引号中就能得到字符常量。因此,'a'、';'和'0'都是合法的字符常量。第一个常量表示字母a,第二个表示分号,第三个表示字符0,它并不等同于数字0。不要把字符常量和C语言风格的字符串混为一谈,字符常量是放在单引号中的单个字符,而字符串则是放在双引号中的任意个数的字符。正如在第3章提及的,前面有@字符并且放在双引号中的字符串是NSString字符串对象。
字符常量'\n'(即换行符)是一个合法的字符常量,尽管它似乎与前面提到的规则矛盾。这是因为反斜杠符号被认为是特殊符号。换句话说,Objective-C编译器将字符'\n'看做单个字符,尽管它实际上由两个字符组成。其他特殊字符也是以反斜杠字符开头的。在NSLog调用中可以使用格式字符%c,以便显示char变量的值。
在代码清单4-1中,使用了基本的Objective-C数据类型。
代码清单4-1
#import <Foundation/Foundation.h>
 
int main (int argc, char *argv[])
{
   @autoreleasepool {
      int    integerVar = 100;
      float floatingVar = 331.79;
      double doubleVar = 8.44e+11;
      char   charVar = 'W';
 
      NSLog (@"integerVar = %i", integerVar);
      NSLog (@"floatingVar = %f", floatingVar);
      NSLog (@"doubleVar = %e", doubleVar);
      NSLog (@"doubleVar = %g", doubleVar);
      NSLog (@"charVar = %c", charVar);
    }
    return 0;
}
 
代码清单4-1  输出
integerVar = 100
floatingVar = 331.790009
doubleVar = 8.440000e+11
doubleVar = 8.44e+11
charVar = W
 
在程序输出的第二行,你会注意到指定给floatingVar的值331.79,实际显示成了331.790009。事实上,实际显示的值是由具体使用的计算机系统决定的。出现这种不准确值的原因在于,计算机内部使用了特殊的方式表示数字。使用计算器处理数字时,很可能遇到相同的不准确性。如果用计算器计算1除以3,将得到结果.33333333,很可能结尾带有一些附加的3。这一串3是计算器计算1/3的近似值。理论上,应该存在无限个3。然而该计算器只能保存这些位的数字,这就是计算机的不确定性。同样的不确定性也出现在这里:在计算机内存中不能精确地表示一些浮点值。
限定词:long、long long、short、unsigned及signed
如果直接把限定词long放在int声明之前,那么所声明的整型变量在某些计算机上具有扩展的值域。一个long int声明的例子为:
long int factorial;
这条语句将变量fractorial声明为long的整型变量。就像float和double变量一样,long变量的具体范围也是由具体的计算机系统决定的。
要用NSLog显示long int的值,就要使用字母l作为修饰符,放在整型格式符号之前。这意味着格式符号%li将用十进制格式显示long int的值。
你也可以使用long long int变量,甚至是具有更大范围带有浮点数的long double变量。
把限定词short放在int声明之前时,它告诉Objective-C编译器要声明的特定变量用来存储相当小的整数。之所以使用short变量,主要原因是对节约内存空间的考虑,当程序员需要大量内存而可用的内存量又十分有限时,就可用short变量来解决这个问题。
最后一个可以放在int变量之前的限定词,是在整数变量只用来存储正数的情况下使用的。以下语句
unsigned int counter;
向编译器声明,变量counter只用于保存正值。通过限制整型变量的使用,让它专门用于存储正整数,可以扩展整型变量的范围。
id类型
id数据类型可存储任何类型的对象。从某种意义说,它是一般对象类型。例如,程序行
id   graphicObject;
将graphicObject声明为id类型的变量。可声明方法使其具有id类型的返回值,如下:
-(id) newObject: (int) type;
这个程序行声明了一个名为newObject的实例方法,它具有名为type的单个整型参数并有id类型的返回值。
id类型是本书经常使用的一种重要的数据类型。这里介绍该类型的目的是为了保持本书的完整性。id类型是Objective-C中十分重要的特性,它是多态和动态绑定的基础,这两个特性将在第9章“多态、动态类型和动态绑定”中详细讨论。
表4.1总结了基本数据类型和限定词。
表4.1  基础数据类型
类    型
实    例
NSLog字符
char
'a'、'\n'
%c
short int
%hi、%hx、%ho  
unsigned short int
%hu、%hx、%ho %hu、%hx、%ho
int
12、-97、0xFFE0、0177
%i、%x、%o
unsigned int
12u、100U、0XFFu
%u、%x、%o
long int
12L、-2001、0xffffL
%li、%lx、%lo
unsigned long int
12UL、100ul、0xffeeUL
%lu、%lx、%lo
long long int
0xe5e5e5e5LL、500ll
%lli、%llx、&llo
unsigned long long int
12ull、0xffeeULL
%llu、%llx、%llo
float
12.34f、3.1e-5f、0x1.5p10、0x1P-1
%f、%e、%g、%a
double
12.34、3.1e-5、0x.1p3
%f、%e、%g、%a
long double
12.34L、3.1e-5l
%Lf、$Le、%Lg
id
nil
%p
 
注意
在表4.1中,在整型常量中以0开头表示常量是八进制(基数8)的,以0x开头或(0X)表示它是十六进制(基数16)的,数字0x.1p3表示十六进制浮点常量。不必担心这些格式,这里只是为了使表格完整进行的总结。此外,前缀f、l(L)、u(U)和ll(LL)用来明确表示常量是float、long、unsigned和long long类型。
 
本文节选自《Objective-C 程序设计(第4版)》

电子工业出版社出版
[美]Stephen G. Kochan(斯蒂芬·G·科昌)著
林冀 范俊 朱奕欣译