Типы данных


Переменная имеет определенный тип. И этот тип определяет, какие значения может иметь переменная и сколько байт в памяти она будет занимать. В Си определены следующие базовые типы данных:

char: представляет один символ. Занимает в памяти 1 байт (8 бит). Может хранить любой значение из диапазона от -128 до 127

unsigned char: представляет один символ. Занимает в памяти 1 байт (8 бит). Может хранить любой значение из диапазона от 0 до 255

signed char: то же самое, что и char

short int: представляет целое число в диапазоне от –32768 до 32767. Занимает в памяти 2 байта (16 бит).

short: то же самое, что и short int.

unsigned short int: представляет целое число в диапазоне от 0 до 65535. Занимает в памяти 2 байта (16 бит).

unsigned short: то же самое, что и unsigned short int.

signed short int: то же самое, что и short int.

signed short: то же самое, что и short int.

int: представляет целое число. В зависимости от архитектуры процессора может занимать 2 байта (16 бит) или 4 байта (32 бита). Диапазон предельных значений соответственно также может варьироваться от –32768 до 32767 (при 2 байтах) или от −2 147 483 648 до 2 147 483 647 (при 4 байтах).

unsigned int: представляет положительное целое число. В зависимости от архитектуры процессора может занимать 2 байта (16 бит) или 4 байта (32 бита), и из-за этого диапазон предельных значений может меняться: от 0 до 65535 (для 2 байт), либо от 0 до 4 294 967 295 (для 4 байт).

unsigned: то же самое, что и unsigned int

signed int: то же самое, что и int

signed: то же самое, что и int

long int: представляет целое число в диапазоне от −2 147 483 648 до 2 147 483 647. Занимает в памяти 4 байта (32 бита).

long: то же самое, что и long int.

signed long int: то же самое, что и long int.

signed long: то же самое, что и long int.

unsigned long int: представляет целое число в диапазоне от 0 до 4 294 967 295. Занимает в памяти 4 байта (32 бита).

unsigned long: то же самое, что и unsigned long int.

long long int: представляет целое число в диапазоне от −9 223 372 036 854 775 808 до +9 223 372 036 854 775 807. Занимает в памяти, как правило, 8 байт (64 бита).

long long: то же самое, что и long long int.

signed long long int: то же самое, что и long long int

signed long long: то же самое, что и long long int.

unsigned long long int: представляет целое число в диапазоне от 0 до 18 446 744 073 709 551 615. Занимает в памяти, как правило, 8 байт (64 бита).

unsigned long long: то же самое, что и unsigned long long int.

float: представляет вещественное число ординарной точности с плавающей точкой в диапазоне +/- 3.4E-38 до 3.4E+38. В памяти занимает 4 байта (32 бита)

double: представляет вещественное число двойной точности с плавающей точкой в диапазоне +/- 1.7E-308 до 1.7E+308. В памяти занимает 8 байт (64 бита)

long double: представляет вещественное число двойной точности с плавающей точкой в диапазоне +/- 3.4E-4932 до 1.1E+4932. В памяти занимает 10 байт (80 бит). На некоторых системах может занимать 96 и 128 бит.

void: тип без значения

Определим несколько переменных:

1
2
3
4
5
int number = 2;
int a, b;
char c ='d';
float d = -2.1345;
double f = 3.45;
Если нам надо определить несколько переменных одного типа, то мы можем указать их названия после типа данных через запятую: int a, b

Переменная типа char в качестве значения принимает один символ в одинарных кавычках: char c ='d'. Также можно присвоить число из указанного выше в списке диапазона: char c = 120. В этом случае значением переменной c будет тот символ, который имеет код 120 в таблице символов ASCII.

В выше приведенном списке для каждого типа указан размер, который он занимает в памяти. Однако стоит отметить, что предельные размеры для типов разработчики компиляторов могут выбирать самостоятельно, исходя из аппаратных возможностей компьютера. Стандарт устанавливает лишь минимальные значения, которые должны быть. Например, для типов int и short минимальное значение - 16 бит, для типа long - 32 бита. При этом размер типа long должен быть не меньше размера типа int, а размер типа int - не меньше размера типа short. Но в целом для типов используются те размеры, которые указаны выше при описании типов данных.

Однако бывают ситуации, когда необходимо точно знать размер определенного типа. И для этого в C есть оператор sizeof(), который возвращает размер памяти в байтах, которую занимает переменная:

1
2
3
4
5
6
7
8
#include <stdio.h>

int main(void)
{
int number = 2;
printf("sizeof(number) = %d \n", sizeof(number));
return 0;
}
Консольный вывод:

sizeof(number) = 4
При этом при определении переменных важно понимать, что значение переменной не должно выходить за те пределы, которые очерчены для ее типа. Например:

1
unsigned short int number = -65535;
Компилятор GCC при компиляции программы с этой строкой выдаст ошибку о том, что значение -65535 не входит в диапазон допустимых значений для типа unsigned short int.

Но как видно из перечисления типов, ряд из них, например, int, может содержать разные значения в зависимости от платформы. В этом случае мы можем получить минимально и максимально допустимые значения с помощью встроенных значений INT_MIN и INT_MAX:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <limits.h>

int main(void)
{
printf("INT_MIN = %d \n", INT_MIN);
printf("INT_MAX = %d \n", INT_MAX);
return 0;
}
Значения INT_MIN и INT_MAX определены в заголовочном файле limits.h, поэтому его необходимо подключить с помощью директивы include.