Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Первые шаги в программировании: основы, Си, 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 и предполагается по умолчанию, его лучше всего указывать явно, чтобы не было проблем с разными интерпретаторами.

 

Продолжение на сайте www.tryobj.com


В избранное