Программирование AVR: решение проблем, FAQ Типы данных языка C, используемые avr-gcc Fri, November 08 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Типы данных языка C, используемые avr-gcc Печать
Добавил(а) microsin   

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

[Типы char]

Для 8-битного процессора (AVR как раз относится к 8-битным) самым предпочтительной переменной будет тип char или unsigned char. Очевидно почему - потому что разрядность такой переменной точно соответствует разрядности регистров и большинства инструкций. Имя типа char произошло от слова "character", т. е. "символ", потому что тип char с самых истоков вычислительных систем всегда использовался для хранения кодов символов (ASCII). Тип char знаковый (самый старший бит 8-битного значения хранит знак числа), и он может кодировать ряд значений от -128 до +127 в дополнительном коде. Беззнаковый тип unsigned char может хранить числа без знака (положительные числа) в диапазоне от 0 до 255. Некоторые компиляторы могут исопользовать встроенный тип byte, который является эквивалентом типа unsigned char.

Заголовочный файл inttypes.h определяет другие популярные имена для 8-битных типов: int8_t и uint8_t (см. далее раздел "inttypes.h").

[Пользовательские типы]

Язык C разрешает пользователю определять свои собственные типы, для чего используется слово typedef:

typedef unsigned char byte;  // создание типа byte
typedef unsigned int word;    // создание типа word (для AVR тип int имеет разрядность 16 бит)
 
byte myVal1;   // определение 8-битной переменной
word myVal2;   // определение 16-битной переменной

Другими словани, определение пользовательского типа имеет следующую общую форму:

typedef стандартный_тип пользовательский_тип

Некоторые программисты почему-то любят определять типы с помощью ключевого слова #define. Это не самый лучший способ, однако работает:

#define byte unsigned char
#define word unsigned int
 
byte myVal1;   // определение 8-битной переменной
word myVal2;   // определение 16-битной переменной

[inttypes.h]

В составе библиотечных файлов компилятора WinAVR (т. е. avr-gcc) есть заголовочный файл, где для удобства определены некоторые часто используемые пользовательские типы:

typedef signed char int8_t;         // 8-битная переменная со знаком
typedef unsigned char uint8_t;      // 8-битная переменная без знака
typedef int int16_t;                // 16-битная переменная со знаком
typedef unsigned int uint16_t;      // 16-битная переменная без знака
typedef long int32_t;               // 32-битная переменная со знаком
typedef unsigned long uint32_t;     // 32-битная переменная без знака
typedef long long int64_t;          // 64-битная переменная со знаком
typedef unsigned long long uint64_t;// 64-битная переменная без знака

Обратите внимание, что здесь в имени типа сразу закодирована его разрядность. Это очень удобно, потому что не надо помнить, какая разрядность у какого типа. Мне больше нравится другое, более короткое определение типов с указанием разрядности:

typedef signed char        s8;   // 8-битная переменная со знаком
typedef unsigned char      u8;   // 8-битная переменная без знака
typedef int                s16;  // 16-битная переменная со знаком
typedef unsigned int       u16;  // 16-битная переменная без знака
typedef long               s32;  // 32-битная переменная со знаком
typedef unsigned long      u32;  // 32-битная переменная без знака
typedef long long          s64;  // 64-битная переменная со знаком
typedef unsigned long long u64;  // 64-битная переменная без знака

Здесь символ s обозначает "signed", т. е. число со знаком, а символ u обозначает "unsigned", т. е. число без знака. Цифры 8, 16, 32 и 64 обозначают разрядность типа.

[Ссылки]

1. More about C types in AVR-GCC site:winavr.scienceprog.com.

 

Добавить комментарий


Защитный код
Обновить

Top of Page