iOS Mobile Инженер

iOS Mobile Инженер

Роадмап навыков для прокачки

Базовые типы данных: int, float, double, BOOL, char

Objective-CОсновыСинтаксис и основы

Основная идея

Objective-C использует базовые типы данных из C для хранения чисел, символов и логических значений. Понимание этих типов — фундамент для работы с языком.

Основные типы

  • int — целые числа (обычно 32 бита)
  • float — числа с плавающей точкой одинарной точности
  • double — числа с плавающей точкой двойной точности
  • BOOL — логический тип (YES/NO)
  • char — один символ (1 байт)

Размеры и диапазоны

  • int: -2,147,483,648 до 2,147,483,647
  • float: ~6-7 значащих цифр
  • double: ~15-16 значащих цифр
  • BOOL: YES (1) или NO (0)
  • char: -128 до 127 или один ASCII символ

Частые ошибки на собеседованиях

  • Путают float и double при работе с точностью
  • Не понимают, что BOOL — это signed char (может содержать не только 0/1)
  • Забывают про переполнение int
  • Путают char как число и как символ

Введение

Базовые типы данных в Objective-C унаследованы от языка C. Они используются для хранения примитивных значений: чисел, символов и логических значений. Понимание их особенностей критически важно для корректной работы с памятью и вычислениями.


Целочисленные типы

int — основной целочисленный тип

objc
int age = 25;
int count = -100;
int maxValue = 2147483647;
ТипРазмерДиапазон
int4 байта-2,147,483,648 ... 2,147,483,647
short2 байта-32,768 ... 32,767
long4/8 байтзависит от платформы
long long8 байт±9.2 × 10^18

Code Example 1: Какие значения получат переменные?

objc
int a = 10;
int b = -5;
int c = 2147483647;
int d = c + 1;
⚠️

Переполнение int приводит к неопределённому поведению! В примере выше d может стать отрицательным.

Беззнаковые типы (unsigned)

objc
unsigned int positiveOnly = 4000000000u;
unsigned short small = 65535;
ТипРазмерДиапазон
unsigned int4 байта0 ... 4,294,967,295
unsigned short2 байта0 ... 65,535

Вещественные типы

float — одинарная точность

objc
float pi = 3.14159f;
float temperature = -40.5f;

double — двойная точность

objc
double precisePi = 3.141592653589793;
double verySmall = 0.0000001;

Code Example 2: Какая разница в точности?

objc
float f = 123456789.123456789f;
double d = 123456789.123456789;
 
NSLog(@"float:  %.10f", f);
NSLog(@"double: %.10f", d);
ТипРазмерТочностьДиапазон
float4 байта~7 цифр±3.4 × 10^38
double8 байт~15 цифр±1.8 × 10^308

Используйте суффикс f для float литералов: 3.14f. Без суффикса число считается double.


BOOL — логический тип

objc
BOOL isActive = YES;
BOOL isComplete = NO;

Code Example 3: Какие значения примут переменные?

objc
BOOL a = YES;
BOOL b = NO;
BOOL c = 1;
BOOL d = 0;
BOOL e = 42;
 
NSLog(@"YES = %d, NO = %d", YES, NO);

Особенности BOOL

КонстантаЗначение
YES1
NO0
⚠️

BOOL в Objective-C — это signed char (1 байт). Он может содержать любое значение от -128 до 127, не только 0/1. Поэтому не сравнивайте напрямую с YES!

objc
BOOL flag = 2;  // Это допустимо, но опасно!
 
if (flag == YES) {
    // Не выполнится, потому что 2 != 1
}
 
if (flag) {
    // Выполнится, потому что 2 != 0
}

char — символьный тип

Как символ

objc
char letter = 'A';
char digit = '5';
char newline = '\n';

Как число

objc
char smallNumber = 100;
char asciiCode = 65;  // Символ 'A'

Code Example 4: Что выведет этот код?

objc
char ch = 'A';
NSLog(@"Символ: %c", ch);
NSLog(@"ASCII код: %d", ch);
 
ch = ch + 1;
NSLog(@"Следующий символ: %c", ch);
ТипРазмерДиапазон
char1 байт-128 ... 127
unsigned char1 байт0 ... 255

Спецификаторы формата

Code Example 5: Какой спецификатор использовать для каждого типа?

objc
int i = 42;
float f = 3.14f;
double d = 3.14159265;
char c = 'X';
BOOL b = YES;
 
NSLog(@"int: %d", i);
NSLog(@"float: %f", f);
NSLog(@"double: %f", d);
NSLog(@"double (точный): %.2f", d);
NSLog(@"char: %c", c);
NSLog(@"BOOL: %d", b);
ТипСпецификатор
int%d или %i
unsigned int%u
long%ld
float%f
double%f или %lf
char (символ)%c
char (число)%d

Приведение типов

Code Example 6: Какие значения получатся?

objc
int a = 5;
int b = 2;
 
float result1 = a / b;
float result2 = (float)a / b;
float result3 = a / (float)b;
float result4 = (float)a / (float)b;
 
int truncated = (int)3.9;

Размеры типов

objc
NSLog(@"sizeof(int) = %lu", sizeof(int));
NSLog(@"sizeof(float) = %lu", sizeof(float));
NSLog(@"sizeof(double) = %lu", sizeof(double));
NSLog(@"sizeof(char) = %lu", sizeof(char));
NSLog(@"sizeof(BOOL) = %lu", sizeof(BOOL));

Константы и литералы

objc
// Целочисленные литералы
int decimal = 42;
int octal = 052;        // 0 в начале — восьмеричное
int hex = 0x2A;         // 0x — шестнадцатеричное
 
// Вещественные литералы
float f = 3.14f;        // f — float
double d = 3.14;        // без суффикса — double
double scientific = 1.5e10;  // научная нотация
 
// Символьные литералы
char c = 'A';
char esc = '\n';        // escape-последовательность

Вопросы интервьюера

Q: Чем float отличается от double?

Размером (4 vs 8 байт) и точностью (~7 vs ~15 значащих цифр). Double используется по умолчанию.

Q: Почему BOOL может быть не только YES/NO?

BOOL — это signed char. Он может содержать любое значение -128...127. Поэтому if (flag) безопаснее чем if (flag == YES).

Q: Что произойдёт при переполнении int?

Неопределённое поведение. На практике часто происходит "заворачивание" значения.

Q: Как преобразовать int в float?

Явным приведением: (float)intValue или присваиванием в float переменную.


Источники

Code Example 1: Переполнение int

❓ Какие значения получат переменные?

objc
int a = 10;
int b = -5;
int c = 2147483647;
int d = c + 1;

Code Example 2: Точность float vs double

❓ Какая разница в точности?

objc
float f = 123456789.123456789f;
double d = 123456789.123456789;
 
NSLog(@"float:  %.10f", f);
NSLog(@"double: %.10f", d);

Code Example 3: BOOL и числовые значения

❓ Какие значения примут переменные?

objc
BOOL a = YES;
BOOL b = NO;
BOOL c = 1;
BOOL d = 0;
BOOL e = 42;
 
NSLog(@"YES = %d, NO = %d", YES, NO);

Code Example 4: char как символ и число

❓ Что выведет этот код?

objc
char ch = 'A';
NSLog(@"Символ: %c", ch);
NSLog(@"ASCII код: %d", ch);
 
ch = ch + 1;
NSLog(@"Следующий символ: %c", ch);

Code Example 5: Спецификаторы формата

❓ Какой спецификатор использовать для каждого типа?

objc
int i = 42;
float f = 3.14f;
double d = 3.14159265;
char c = 'X';
BOOL b = YES;
 
NSLog(@"int: %d", i);
NSLog(@"float: %f", f);
NSLog(@"double: %f", d);
NSLog(@"char: %c", c);
NSLog(@"BOOL: %d", b);

Code Example 6: Приведение типов

❓ Какие значения получатся?

objc
int a = 5;
int b = 2;
 
float result1 = a / b;
float result2 = (float)a / b;
float result3 = a / (float)b;
float result4 = (float)a / (float)b;
 
int truncated = (int)3.9;