Модификаторы типов
За исключением типа void, основные типы данных могут иметь различные модификаторы. Модификаторы используются для более точного управления ситуацией. Ниже приведён список модификаторов:
signed
unsigned
long
short
Модификаторы signed, unsigned, long и short могут применяться к целочисленным типам. К символам можно применять signed и unsigned. long может применяться к типу double.
Использование signed для целочисленных типов является избыточным (но допустимым), поскольку объявление целочисленных типов по умолчанию предполагает знаковое число.
Различие между знаковыми и беззнаковыми целочисленными типами заключается в способе интерпретации старшего бита. Если использовать знаковый тип, то компилятор генерирует код, предполагающий, что старший бит используется как знак числа. Если знаковый бит равен 0, то число положительное, а если 1 – отрицательное. Ниже приведены простые примеры:
127 в двоичном представлении: 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
-127 в двоичном представлении: 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
знаковый бит
Следует предупредить, что фактически все компьютеры используют дополнительную арифметику, что приводит к представлению -127 в виде, отличном от приведённого примера.
1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1
Знаковые числа важны для многих алгоритмов, но они могут вмещать только половину значений, которые могут вмещать их беззнаковые собратья. Например, 32767 выглядит следующим образом:
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Если старший бит установлен в 1, то число будет интерпретироваться как -1. Если же объявить его как unsigned short int, то, если старший бит установлен, число будет содержать 65535.
Модификаторы доступа
С имеет 2 типа модификаторов, которые используются для контроля за способом доступа или модификации переменных. Эти модификаторы называются const и volatile.
Переменные типа const не могут изменяться во время выполнения программы. Например:
const int a;
создаст целочисленную переменную, называемую а, которая не может быть модифицирована в программе. Она может использоваться в других типах выражений. Она может использоваться в других типах выражений. Переменная с модификатором const получает своё значение или при инициализации, или каким-либо аппаратно-зависимым способом. Например, нижеприведённая строка присваивает count значение 100:
const int count = 100;
Помимо инициализации константа не может быть модифицирована программой.
Модификатор volatile используется для сообщения компилятору о возможности изменения значения способами, не определёнными в программе. Это важно, поскольку компилятор автоматически оптимизирует некоторые выражения, делая предположения, что содержимое переменных не изменяется в выражениях. Также некоторые виды оптимизации могут изменять порядок вычисления выражений во время процесса компиляции. Модификатор volatile предотвращает возникновение данных изменений.
Возможно использование этих модификаторов вместе. Например, если предполагается, что 0х30 является адресом порта, содержимое которого изменяется внешним устройством, то следующее объявление предохранит от побочных эффектов:
const volatile unsigned char *port = 0x30;
