Первые шаги в программировании: основы, Си, Objective-c
1.26
Типы и размеры данных
Ранее мы уже ознакомились с некоторыми типами данных, говоря о битах и байтах.
Также мы уже практиковались в некоторых математических операциях в Практикуме по программированию.
Однако мы не касались особо подробно вопроса типов данных используемых для хранения информации и вычислений в программах.
Сейчас коснемся этого вопроса подробнее.
Как вы знаете, любая программа состоит из двух основных частей:
- первая часть содержит информацию, которую она обрабатывает и
- вторая часть состоит из набора команд, при выполнении которых происходит обработка имеющейся информации.
Как раз ту информацию, с которой работает компьютерная программа и называют данными, и в программе она находиться, как вы помните, в виде чисел, которые хранятся в ячейках оперативной памяти.
Тип данных определяет размер ячейки, и внутреннее представление числа, хранящегося в ней, которое может быть как вы помните:
- целым со знаком,
- целым без знака и
- вещественным (числом с дробной частью).
В языках программирования, как правило, имеется четыре основных типа данных, два целых и два вещественных.
Для обозначения типа данных используют определенные ключевые слова.
Для целых чисел: char – целое число со знаком размером 1 байт; данный тип данных
используется для небольших чисел (диапазон от -127 до 127 для знаковых
чисел и от 0 до 255 для беззнаковых чисел), для разных символов: буква,
цифра, знак препинания... ; int – целое число со знаком размером 4 байта (для современных 32-х и 64-х разрядных операционных систем);
Для обозначения вещественных чисел: float – число с плавающей точкой одинарной точности размером 4
байта; Это как-бы уменьшенная копия типа double, занимающая меньше
памяти, но и имеющая меньшую точность и диапазон значений. double – число с плавающей точкой двойной точности размером 8 байт.
Точность для типа float составляет 7 - 8 значимых разрядов (первых цифр в представлении числа) Точность для типа double удвоенна и составляет 15 - 16 значимых разрядов.
Помимо основных типов данных в языках программирования имеются модификаторы, с помощью которых можно изменить представление числа в ячейке (модификатор представления) или ее размер (модификатор размера).
Модификаторы представления числа в ячейке памяти signed и unsigned
Данные модификаторы называются также как спецификаторы.
Если вы помните, мы упоминали о том, что числа могут быть как:
- положительными - от 0 и выше - т.е. беззнаковыми (unsigned)
- и отрицательными - имеющими минус перед цифрой - знаковые (signed)
Модификаторы (спецификаторы) используются в сочетании с основными типами данных последующим образом:
[модификатор_представления] [модификатор_размера] базовый тип данных
В квадратных скобках показаны необязательные части формы.
По умолчанию все типы данных имеют значение signed, т.е. позволяют хранить в ячейке памяти как положительные, так и отрицательные числа.
А вот для расширения диапазона чисел можно явно указать, что нам не
требуется хранить отрицательные числа и поставив перед типом данных
модификатор unsigned увеличить тем самым диапазон хранения данных в два раза.
Таким образом мы изменяем представление числа в ячейке памяти где оно хранится.
Когда мы с вами рассматривали математические операции с двоичными
числами мы говорили о том, что в числах со знаком старший бит
используется для указания знака числа.
По этой причине целые числа со знаком и без знака интерпретируются
компилятором по разному в отношении нахождения старшего бита числа.
Если целое объявлено со знаком, компилятор считает, что старший бит содержит знак числа.
Если в старшем бите записан 0, число считается положительным, а если 1 — отрицательным.
Например:
Знаковое целое число 32767 в двоичном коде имеет вид 01111111 11111111
Если в старший бит записать 1 и рассматривать полученное число как signed int, то оно будет интерпретироваться как -1.
Однако если это же число рассматривать числом объявленным как unsigned int, то оно будет интерпретироваться как 65535.
Программист должен понимать какой тип данных использовать в конкретном случае для решения поставленной задачи.
Поскольку программист пишет программу которая и решет эту задачу, то он
как никто другой знает с какими данными предстоит работать.
И чтобы свести к минимуму потребление памяти на резервирование под тот
или иной тип данных программист указывает с чем он будет работать.
К примеру если в задаче необходимо указывать данные о человеке:
Возраст, количество детей, этаж ...
Как вы видите, все эти данные не могут иметь отрицательного значения и
они явно не будут иметь значение больше 127, по этой причине нет
необходимости устанавливать для них тип данных int, который занимает 4
байта.
Можно ограничиться обычным char занимающим всего 1 байт и в который
можно записать положительные числа до 127 в варианте по умолчанию -
signed (который может хранить, напоминаю, как положительные, так и
отрицательные числа).
Если же нам необходимо хранить данные о:
номере квартиры, номере дома (как пример), ...
Эти данные могут превысить число 127 однако они будут меньше 255 (как
пример в данном случае), то поставив перед типом данных char модификатор
unsigned - (unsigned char) - мы сразу расширим диапазон положительных
чисел до 255.
И нам снова не нужно прибегать к типу данных int.
Если спецификатор типа данных записан один - без следующего за ним
базового типа данных, то интерпретатор считает, что он модифицирует тип
данных int.
Таким образом, следующие спецификаторы типов эквивалентны:
Спецификатор
Эквивалентно записи
signed
signed int
unsigned
unsigned int
long
long int
short
short int
Следует помнить, что хотя базовый тип данных int и предполагается по
умолчанию, его лучше всего указывать явно, чтобы не было проблем с
разными интерпретаторами.