变更履历
版本:v1.0
简介
这一章主要描述 OC 的基本数据类型,并描述一些用于构成算术表达式的基本规则。
数据类型和常量
在 Objective-C 中,任何数字、单个字符或者字符串通常都成为常量。
int、float、double、char
每一个值,不管是字符、整数还是浮点数字,都有与其对应的值域,这个值域与存储特定类型的值而分配的内存有关。一般来说,语言中没有规定这个量,它通常依赖于所运行的计算机,因此叫做设备或机器相关量。
这也是告诉我们,做开发时,尽量不要去假定数据类型的大小。
id 类型
id 数据类型可以存储任何类型的对象,它是 OC 中十分重要的特性,是多态和动态绑定的基础。
-(id) newObject: (int) type
{
...
}
基本数据类型
类型 | 实例常量 | NSLog 字符 |
---|---|---|
char | 'a'、'\n' | %c |
short int | - | %hi、%hx、%ho |
unsigned short int | - | %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 |
算数表达式
整数值和浮点值的互相转换
// Basic conversions in Objective-C
#import <Foundation/Foundation.h>
int main (int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
float f1 = 123.125, f2;
int i1, i2 = -150;
i1 = f1; // floating to integer conversion
NSLog (@"%f assigned to an int produces %i", f1, i1);
f1 = i2; // integer to floating conversion
NSLog (@"%i assigned to a float produces %f", i2, f1);
f1 = i2 / 100; // integer divided by integer
NSLog (@"%i divided by 100 produces %f", i2, f1);
f2 = i2 / 100.0; // integer divided by a float
NSLog (@"%i divided by 100.0 produces %f", i2, f2);
f2 = (float) i2 / 100; // type cast operator
NSLog (@"(float) %i divided by 100 produces %f", i2, f2);
[pool drain];
return 0;
}
在 OC 中,只要将浮点值赋给整形变量,数字的小数部分都将被删除。把整型变量指派给浮点变量不会引起数值的任何改变。
算术表达式的两点规则
- 当表达式中的两个运算数是整数(),该运算就将在整数运算规则下进行。因此,由运算产生的任何小数部分都将被删除,即便将结果指配给一个浮点变量也是如此。可以参见程序中的第三个输出。
- 当表达式中的两个运算数有一个是浮点变量或常量,那么这一运算将作为浮点运算来处理。可以参见程序中的第四个输出。
类型转换运算符
与其它语言一样,(float) a 可作为一个强制类型转换。用法如下:
int a = (int) 29.55 + (int) 21.99;
float f = (float) 6 / (float) 4;
id number;
Fraction *fraction;
fraction = (Fraction *) number;
赋值运算符
OC 支持 op= 这种语法,op 可以是任何算术运算符,包括 +、-、*、/ 和 %。此外,op 还可以是任何用于移位和屏蔽操作的运算符。
counter -=5;
位运算符
符号 | 运算 | 符号 | 运算 |
& | 按位与 | ~ | 一次求反 |
| | 按位或 | << | 左移位 |
^ | 按位异或 | >> | 右移位 |
右移位运算符
从值的低位移出得位将丢失。把无符号的值向右移位总是在左侧(高位)移入0。对于有符号值而言,左侧移入1还是0依赖于被移动数字的符号,还取决于该操作在计算机上的实现方式。如果符号位是0(表示正数),不管那种机器都将移入0。然而,如果符号位是1,则不一定。前一类型的运算符通常称为算术右移,后者通常称为逻辑右移。
不要去假设系统使用算术右移还是逻辑右移,这可能会造成未知的错误。
类型 _Bool、_Complex 和 _Imaginary
用于处理 Boolean(0 或 1)值的 _Bool,以及分别用于处理复数和抽象数字的 _Complex 和 _Imaginary。
OC 推荐使用 BOOL 数据类型来代替 _Bool 来处理 Boolean 值。BOOL 本身实际上并不是真正的数据类型,它只是 char 数据类型的别名,通过关键字 typedef 实现。