Александр Микушин - Занимательно о микроконтроллерах стр 61.

Шрифт
Фон

Александр Микушин - Занимательно о микроконтроллерах

Отметим, что ключевые слова signed и unsigned необязательны. Они указывают, как интерпретируется старший бит объявляемой переменной, т. е. если указано ключевое слово unsigned, то нулевой бит интерпретируется как часть числа, в противном случае нулевой бит интерпретируется как знаковый.

При отсутствии ключевого слова unsigned целочисленная переменная считается знаковой. В том случае, если спецификатор типа состоит из ключевого типа signed или unsigned и далее следует идентификатор переменной, то она будет рассматриваться как переменная типа int. Например:

unsigned int n; //Беззнаковое шестнадцатиразрядное число n

unsigned int b;

int с; /*подразумевается signed int с */

unsigned d; /*подразумевается unsigned int d */

signed f; /*подразумевается signed int f */

Отметим, что модификатор типа char используется для представления одиночного символа или для объявления литеральных строк. Численное значение объекта типа char соответствует ANSI-коду записанного символа (размером 1 байт).

Отметим также, что восьмеричные и шестнадцатеричные константы также могут иметь модификатор unsigned. Это достигается указанием префикса и или и после константы, константа без этого префикса считается знаковой.

Например:

0хА8С //int signed;

017861 //long signed;

0xF7u //int unsigned;

Числа с плавающей запятой

Для переменных, представляющих число с плавающей запятой? используется модификатор типа float. Спецификатор double тоже допустим в языке программирования С-51, но он не приводит к увеличению точности результата.

Величина со спецификатором типа float занимает 4 байта. Из них 1 бит отводится для знака, 8 битов для избыточной экспоненты и 23 бита для мантиссы. Отметим, что старший бит мантиссы всегда равен 1, поэтому он явным образом в битовом представлении числа не указывается, в связи с этим диапазон значений переменной с плавающей точкой равен от ±1.175494Е-38 до ±3.402823Е+38.

Пример объявления переменной:

float f, a, b;

Переменные перечислимого типа

Переменная, которая может принимать значение из некоторого списка значений, называется переменной перечислимого типа или перечислением (enum). Использование такого вида переменной эквивалентно применению целочисленного знакового значения типа char или int. Это означает, что для переменной перечислимого типа будет выделен один или два байта в зависимости от максимального значения используемых этой переменной констант. В отличие от переменных целого типа, переменные перечислимого типа позволяют вместо безликих чисел использовать имена констант, которые более понятны и легче запоминаются.

Например, вместо использования чисел 1, 2, 3, 4, 5, 6, 7 можно использовать Названия Дней Недели: Poned, Vtorn, Sreda, Chetv, Pjatn, Subb, Voskr. При этом каждой константе будет соответствовать конкретное число.

Использование имен констант приведет к более понятной программе. Более того, транслятор отслеживает правильность использования констант и при попытке использования константы, не входящей в объявленный заранее список, выдает сообщение об ошибке.

Переменные enum-типа могут использоваться в индексных выражениях и как операнды в арифметических операциях и в операциях отношения.

Например:

If(rab_ned == SUB) dejstvie = rabota [rab_ned];

При объявлении перечисления определяется тип переменной перечисления и определяется список именованных констант, называемый списком перечисления. Значением каждого имени этого списка является целое число. Объявление перечислимой переменной начинается с ключевого слова enum и может быть представлено в двух формах:

"enum" [Имя типа перечисления] '{' Список констант'}' Имя1 [',' Имя2…];

"enum" Имя типа перечисления Описатель [',' Описатель..];

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

Список констант содержит одну или несколько конструкций вида:

Идентификатор ['=' Константное выражение]

Каждый Идентификатор - это имя константы. Все идентификаторы в списке констант оператора enum должны быть уникальными. Если константе явным образом не присваивается Константное выражение (чаще всего это число), то первому идентификатору присваивается значение 0, следующему - значение 1 и т. д.

Пример объявления переменной rab_ned и типа week для переменных, совместимых с переменной rab_ned, выглядит следующим образом:

enum week {SUB = 0, /* константе SUB присвоено значение 0 */

VOS = 0, /* константе VOS присвоено значение 0 */

POND, /* константе POND присвоено значение 1 */

VTOR, /* константе VTOR присвоено значение 2 */

SRED, /* константе SRED присвоено значение 3 */

HETV, /* константе HETV присвоено значение 4 */

PJAT /* константе PJAT присвоено значение 5 */

} rab ned;

Идентификатор, связанный с Константным выражением, принимает значение, задаваемое этим Константным выражением. Результат вычисления Константного выражения должен иметь тип int и может быть как положительным, так и отрицательным. Следующему идентификатору в списке, если этот Идентификатор не имеет своего Константного выражения, присваивается значение, равное константному выражению предыдущего идентификатора плюс 1. Использование констант должно подчиняться следующим правилам:

- объявляемая переменная может содержать повторяющиеся значения констант;

- идентификаторы в списке констант должны быть отличны от всех других идентификаторов в той же области видимости, включая имена обычных переменных и идентификаторы из других списков констант;

- Имена типов перечислений должны быть отличны от других имен типов перечислений, структур и объединений в этой же области видимости;

- значение может следовать за последним элементом списка констант перечисления.

Во втором формате для объявления переменной перечислимого типа используется готовый тип переменной, уже объявленный ранее. Например: enum week rabl;

К переменной перечислимого типа можно обращаться при помощи указателей. При этом необходимо заранее определить тип переменной, на которую будет ссылаться указатель. Это может быть сделано, как описывалось выше или при помощи оператора typedef. Например:

typedef enum {SUB = 0, /* константе SUB присвоено значение 0 */

VOS = 0, /* константе VOS присвоено значение 0 */

POND, /* константе POND присвоено значение 1 */

VTOR, /* константе VTOR присвоено значение 2 */

SRED, /* константе SRED присвоено значение 3 */

HETV, /* константе HETV присвоено значение 4 */

PJAT /* константе PJAT присвоено значение 5 */

} week;

Этот оператор не объявляет переменную, а только определяет тип переменной, отличающийся от стандартного. В дальнейшем этот тип может быть использован для объявления переменных и указателей на переменные.

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке