`

Objective-C 数据类型整理

 
阅读更多

id 数据类型 可存储任何类型的对象。从某种意义说,它是一般对象类型。

 

例如,程序行

     id number;

     将number声明为id类型的变量。可声明方法使其具有id类型的返回值,如下:

     -(id) newObject: (int) type;

     这个程序行声明了一个名为newObject的实例方法,它具有名为type的单个整型参数并有id类型的返回值。应该注意的是,对返回值和参数类型声明来说,id是默认的类型。因此,以下程序行:

     +allocInit;

     声明了一个返回id类型的类方法。
     id类型是Objective-C中的非常重要的数据类型,它是多态和动态绑定的基础,这在以后的苹果开发中会经常用到。


    *在Objective-C里有如下几个限定词需要了解:long,long long, short,unsigned,signed

     long

     如果直接把限定词long放在int声明之前,那么所声明的整型变量在某些计算机上具有扩展的值域。一个long int声明的例子为:

     long int factorial;

     这条语句将变量factorial声明为long的整型变量,也就是长整型。就象float和double变量一样,long变量的具体精度是由具体的计算机系统决定的。在许多系统上,int与long int具有相同的值域,而且任何一个都能存储4个字节(1个字节8位),32位宽(2,147,483,647)的整型值。long在限定整型的时候,实际相当于双精度的short,什么是short? Mike后面会谈。


     long int类型 的常量值可通过在整型常量末尾添加字母L(大小写均可)来形成。单数字和L之间不允许由空格。因为小写的L和数字1容易混淆,建议有用到这种情况,都用大写。下面是个简单的例子:

     long int numberOfPoints = 131071100L;

     将变量numberOfPoints声明为长整型,而且初值为131,071,100。
     要用NSLog显示long int的值,使用字母l做为修饰符并放在整型格式符号i,o和x之前。例如“%lx”表示十六进制格式显示值。

     当然,我们同样可以把 long 标识符放在double声明之前。范例如下:

     long double US_deficit_2004;

     long double常量可写成其尾部带有字母l或L的浮点常量,例如:1.234e+7L
     要显示long double的值,需要使用修饰符L。因此,%Lf用浮点计数法显示long double的值,%Le用科学计数法显示同样的值,而%Lg将告诉NSLog在%Lf和%Le之间任选一个使用。



     long long

     双长整型相当于双精度long,可以用如下形式使用:

     long long int maxAllowedStorage;

     这条语句把指定的变量声明为具有特定扩展精度的双长整型变量,该扩展精度保证变量至少8个字节,具有64位的宽度。NSLog字符串不使用单个字母l,而使用两个l来显示long long的整数,例如“%lli”。



     short

     把限定词short放在int声明之前时,它告诉Objective-C编译器要声明的特定变量用来存储相当小的整数。之所以使用short变量,主要原因是对节约内存空间的考虑,当程序员需要大量内存而可用的内存量又十分有限时,比如iPhone开发的时候,就可用short变量来解决这个问题。
     在某些计算机上,short int占用的内存空间是常规int变量所占空间的一半。在任何情况下,确保分配给short int的空间数量不少于2个字节,16位。

     注意,在Objective-C中,没有其他方法可显式地编写short int型常量。要显示short int变量,可将字母h放在任何普通的整型转换符之前,如:%hi,%ho或%hx。换句话说,可用任何整型转换符号来显示short int,因为当它作为参数传递给NSLog例程时,可转换成整数。



     unsigned

     顾名思义,这个最终限定词就是无符号,可放在int变量之前,当整数变量只用来存储正数的情况下使用最终限定符。以下语句

     unsigned int counter;

     向编译器声明:变量counter只用来保存正值。通过限制整型变量的使用,使它专门存储正整数,可以扩展整型变量的精度。一般unsigned int可简写为uint。
     通过将字母u(或U)放在常量之后,可产生unsigned int常量,例如:0x00ffu
     编写整型常量时,可将字母u(或U)和l(或L)组合起来使用,例如30000UL,告诉编译器将常量20000看作unsigned long。



     简写

     将变量声明为long int,short int或unsigned int类型时,关键字int 可以省略。因此unsigned变量counter可等价地声明为以下形式:

     unsigned counter;

     同时可将char变量声明为unsigned。



     signed

     signed限定词可明确地告诉编译器特定变量是有符号的。它主要用在char声明前面,这个就比较复杂,此处按下不表。



Mike 在介绍完 Objective-C 中的四大基本类型之一 int 类型 后,接下来不得不提的就是 float 类型。声明为 float 类型的变量可存储包含小数位的值。要区分浮点常量,可通过查看其是否包含小数点。可以省略小数点之前的数字,也可以省略之后的数字。然而,显然不能将它们全部省略。值 3.  125.8  -.0001 都是合法的浮点常量。要显示浮点值,可用 NSLog 转换字符 %f。

     浮点常量也能使用所谓的科学计数法来表示。值 1.7e4 就是使用这种计数法来表示的浮点值,它表示值 1.7*10 的 4 次方。位于字母 e 前的值称为尾数,而之后的值称为指数。指数前面可以放置正好或负号,指数表示将与尾数相乘的 10 的幂。因此,在常量 2.25e-3 中,2.25 是尾数值,而 -3 是指数值。该常量表示值 2.25*10 的 -3 次方,或 0.00225。BTW,用于分隔尾数和指数的字母 e,可用大写字母,也可用小写字母。

     要用科学计数法显示值,应该在 NSLog 格式字符串中指定格式字符 %e。使用 NSLog 格式字符串 %g 允许 NSLog 确定使用常用的浮点计数法还是使用科学计数法来显示浮点值。这一决定取决于指数的值:如果该值小于 -4 或大于 5,采用 %e (科学计数法)表示,否则采用 %f (浮点计数法)。

     十六进制的浮点常量包括前导的 0x 或 0X,后面紧跟一个或多个十进制或十六进制数字,再后是 p 或 P,最后是可以带负号的二进制指数。例如,0x0.3p10 表示的值为 3/16*2 的 10 次方 = 192。

今天 Mike 要和大家聊下在 Objective-C 中的 int 数据类型,整数常量由一个或多个数字的序列组成。序列前的负号表示该值是一个负数。值 168,-12 和 0 都是合法的整数常量。数字中间不允许插入空格,大于 999 的值不能用逗号来表示(因此,值 15,000 是个非法的整数常量,它必须写成 15000)。

     在 Objective-C 中存在两种特殊的格式,它们用一种非十进的方式来表示整数常量。如果整型值的第一位是0,那么这个整数将用八进制计数法来表示,就是说基数8来表示。在这种情况下,该值的其余位必须是合法的八进制数字,也就是 0 到 7 之间的数字。因此在 Objective-C 中以八进制表示的值 50 (等价于十进制的值40),表示方式为 050。与此类似,八进制的 0177 表示十进制的值 127(1*64+7*8+7)。通过在NSLog调用的格式字符串中使用格式符号%o,可在终端上用八进制显示整数值。在这种情况下,用八进制显示的值不带有前导 0,而格式符号 %#o 将在八进制值的签名显示前导 0。

     如果整型常量以 0 和字母 x (无论是小写字母还是大写字母) 开头,那么这个值都将用十六进制 (以16为基数) 计数法来表示。紧跟在字母 x 后的是十六进制值的数字,它可由 0 到 9 之间的数字和 a 到 f (或A到F)之间的字母组成。字母表示的数字分别为 10 到 15。因此,要给名为 rgbColor 的整型常量指派十六进制的值FFEF0D,可使用以下语句:

     rgbColor = FFEF0D;

     格式符号 %x 将用十六进制格式显示一个值,该值不带前导的 0x,并用 a 到 f 之间的小写字符表示十六进制数字。要使用前导 0x 显示该值,使用格式字符 %#x,如下所示:

     NSLog("Color is %#x\n", rgbColor);

     %X 或 %#X 中的大写字母 X,可用于显示前导的 x,而随后用大写字母表示的十六进制数字。
     每个值,不管是字符,整数还是浮点数字,都有与其对应的值域。这个值域与存储特定类型的值而分配的内存量有关。一般来说,在语言中没有规定这个量,它通常依赖于所运行的计算机,因此叫做设备或机器相关量。例如,一个整数可在计算机上占用 32 位,或者可以使用 64 位存储。
     永远不要编写假定数据类型大小的程序。然而,要保证为每种基本数据类型留出最小数量的内存。例如,要保证整型值存储在 32 位中。

     十进制就是之前提到过的 %i,这里一笔带过。

     int类型就说到这里为止,接下来博主Mike将把Objective-C数据类型和常量一文中提及的 float,double,char 类型做逐一介绍。

  类型 double 双精度与 类型float 非常相似,而在float变量所提供的值域不能满足要求时,就要使用 double 变量。声明为 double 类型的变量可存储的位数大概是 float 变量所存储的两倍多。大多数计算机使用 64 位来表示 double 值。

     除非另有说明,否则,Objective-C 编译器将所有浮点常量均看作 double 值。要清楚地表示 float 常量,需要再数字的尾部添加一个 f 或 F,例如:

     12.8f

     显示 double 值的方法和显示 float 值的方法相同,同样也是格式符号 %f,%e,%g,具体说明请参见 float 部分。

     关于数值的三大基本数据类型到此结束,Mike 最后需要介绍的就是 char类型。

最后一个 基本数据类型 char 可储存单个字符。将字符放入一对单引号中就能得到字符常量。因此,'a',';' 和 '0' 都是合法的字符常量。第一个常量表示字母 a,第二个表示分号,第三个表示字符 0,它并不等同于数字 0。不要把字符常量和 C 风格的字符串混为一谈,字符常量是放在单引号中的单个字符,而字符串则是放在双引号中的任意个数的字符。前面有 @ 字符并且放在双引号中的字符串是 NSString 字符串对象。
 
     字符常量 '\n' (即换行符)是一个合法的字符常量,尽管它似乎与前面提到的规则矛盾。出现这种情况的原因是反斜杠是 Objective-C 系统中的特殊符号,实际上并不把它看成一个字符。换句话说,Objective-C 编译器将字符 '\n' 看作单个字符,尽管它实际上由两个字符组成。在 NSLog 调用中可以使用 %c,以便显示 char 变量的值。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics