Литье типа Objective-C

Приведение типов - это способ преобразования переменной из одного типа данных в другой тип данных. Например, если вы хотите сохранить длинное значение в простом целочисленном, вы можете ввести cast long в int. Вы можете преобразовывать значения из одного типа в другой явно, используяcast operator следующим образом -

(type_name) expression

В Objective-C мы обычно используем CGFloat для выполнения операции с плавающей запятой, которая является производным от базового типа float в случае 32-битной версии и double в случае 64-битной. Рассмотрим следующий пример, в котором оператор приведения вызывает деление одной целочисленной переменной на другую как операцию с плавающей запятой:

#import <Foundation/Foundation.h>

int main() {
   int sum = 17, count = 5;
   CGFloat mean;

   mean = (CGFloat) sum / count;
   NSLog(@"Value of mean : %f\n", mean );

   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

2013-09-11 01:35:40.047 demo[20634] Value of mean : 3.400000

Здесь следует отметить, что оператор приведения имеет приоритет над делением, поэтому значение sum сначала преобразуется в тип double и, наконец, он делится на количество, что дает двойное значение.

Преобразование типов может быть неявным, что выполняется компилятором автоматически, или может быть указано явно с помощью cast operator. Хорошей практикой программирования считается использование оператора приведения всякий раз, когда требуется преобразование типов.

Целочисленное продвижение

Целочисленное продвижение - это процесс, при котором значения целочисленного типа "меньше", чем int или же unsigned int конвертируются либо в int или же unsigned int. Рассмотрим пример добавления символа в int -

#import <Foundation/Foundation.h>

int main() {
   int  i = 17;
   char c = 'c';  /* ascii value is 99 */
   int sum;

   sum = i + c;
   NSLog(@"Value of sum : %d\n", sum );

   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

2013-09-11 01:38:28.492 demo[980] Value of sum : 116

Здесь значение суммы равно 116, потому что компилятор выполняет целочисленное продвижение и преобразовывает значение 'c' в ascii перед выполнением фактической операции сложения.

Обычное арифметическое преобразование

В usual arithmetic conversionsнеявно выполняются для приведения своих значений к общему типу. Компилятор сначала выполняет целочисленное продвижение , если операнды по-прежнему имеют разные типы, они преобразуются в тип, который отображается наивысшим в следующей иерархии:

Обычные арифметические преобразования не выполняются ни для операторов присваивания, ни для логических операторов && и ||. Давайте возьмем следующий пример, чтобы понять концепцию -

#import <Foundation/Foundation.h>

int main() {
   int  i = 17;
   char c = 'c';  /* ascii value is 99 */
   CGFloat sum;

   sum = i + c;
   NSLog(@"Value of sum : %f\n", sum );
   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

2013-09-11 01:41:39.192 demo[15351] Value of sum : 116.000000

Здесь легко понять, что сначала c преобразуется в целое число, но поскольку конечное значение имеет значение с плавающей запятой, применяется обычное арифметическое преобразование, и компилятор преобразует i и c в число с плавающей запятой и складывает их, получая результат с плавающей запятой.