
Все данные в языке Си имеют свой тип. Переменные определенных типов занимают в памяти какое-то место, разное в зависимости от типа. В Си нет четкого закрепления количества памяти за определенными типами. Это отдано на реализацию конкретного компилятора под конкретную платформу. Например, переменная типа int в одном компиляторе может занимать в памяти 16 бит, в другом — 32 бита, в третьем — 8 бит. Все определяет конкретный компилятор. Правда, все стремятся к универсализации, и в основном в большинстве компиляторов тип int, например, занимает 2 байта, а тип char — один.
Я в последнее время немного затупил, не мог вспомнить, сколько байт занимает тип double в AVR-GCC. Обычно при программировании контроллеров работаешь с целочисленными типами, типа int и char, а к типам с плавающей точкой прибегаешь не часто, в связи с их ресурсоемкостью.
Поэтому, на будущее, оставлю себе здесь памятку с указанием размеров занимаемой памяти типами данных для компилятора AVR-GCC и диапазон изменения переменных этого типа.
Типы данных в языке Си для компилятора AVR-GCC
| Тип | Размер в байтах (битах) |
Интервал изменения |
|---|---|---|
| char | 1 (8) | -128 .. 127 |
| unsigned char | 1 (8) | 0 .. 255 |
| signed char | 1 (8) | -128 .. 127 |
| int | 2 (16) | -32768 .. 32767 |
| unsigned int | 2 (16) | 0 .. 65535 |
| signed int | 2 (16) | -32768 .. 32767 |
| short int | 2 (16) | -32768 .. 32767 |
| unsigned short int | 2 (16) | 0 .. 65535 |
| signed short int | 2 (16) | -32768 .. 32767 |
| long int | 4 (32) | -2147483648 .. 2147483647 |
| unsigned long int | 4 (32) | 0 .. 4294967295 |
| signed long int | 4 (32) | -2147483648 .. 2147483647 |
| float | 4 (32) | 3.4Е-38 .. 3.4Е+38 |
| double | 4 (32) | 3.4Е-38 .. 3.4Е+38 |
| long double | 10 (80) | 3.4Е-4932 .. 3.4Е+4932 |
[stextbox id=»warning» caption=»Обратите внимание»]Реализация типа double в AVR-GCC отступает от стандарта. По стандарту double занимает 64 бита. В AVR-GCC переменная этого типа занимает 32 бита, и соответственно, она эквивалентна переменной с типом float![/stextbox]
В дополнение к этому, в библиотеках AVR-GCC введено несколько производных от стандартных типов. Они описаны в файле stdint.h. Сделано это, наверно, для улучшения наглядности и уменьшения текста программ (ускорения их написания :)). Вот табличка соответствия:
Производные типы от стандартных в языке Си для компилятора AVR-GCC
| Производный тип | Стандартный тип |
|---|---|
| int8_t | signed char |
| uint8_t | unsigned char |
| int16_t | signed int |
| uint16_t | unsigned int |
| int32_t | signed long int |
| uint32_t | unsigned long int |
| int64_t | signed long long int |
| uint64_t | unsigned long long int |
Тип Void
В языке Си есть еще один тип — тип void. Void используется для указания, что функция не возвращает ничего в качестве результата, или не принимает на вход никаких параметров. Этот тип не применяется для объявления переменных, соответственно он не занимает места в памяти.
DigitalChip
Для связи AVR и компьютера по UART на компьютере нужна терминальная программа. После работы с разными программами я остановился на "Terminal 1.9b". Очень удобная терминалка.…
Да, свершилось чудо! И я действительно заказал цифровой осциллограф Rigol DS-1052E. Долго хотел его купить как самый доступный по цене цифровой осциллограф. Но не получалось.…
Все чаще и чаще в своих разработках отечественные радиолюбители применяют импортные радиодетали. Обусловлено это многими причинами. Например, если для жителей крупных городов-миллионников проблем с приобретением…
Некоторое время назад (летом еще) приобрел на пробу датчик движения (PIR Motion sensor) HC-SR501. Брал на Ebay. Поторговался и взял за 2 доллара. Я купил…
У моего родственника в гараже установлен резервный источник освещения на светодиодной ленте и аккумуляторной батарее. Аккумулятор установлен старый, отслуживший свое в автомобиле. А так как…
Вливайтесь в обсуждение
  2 комментария
ARV
12 лет назадесли мне не изменяет память, в AVR-GCC размер float совпадает с double, т.е. совершенно однофигственно, что один формат, что другой.
Chiper
12 лет назадБлин, а ведь точно, float и double имеют одинаковый размер и занимают 4 байта (32 бита). Реализация типа double в AVR-GCC отступает от стандарта. Ё-маё, моя невнимательность…
Спасибо за указание на ошибку, Исправляю в табличке.