Разница между типом данных int и long на Arduino
Я учился программировать для робота с пустотными препятствиями, но, взглянув на код, увидел два типа данных: long и int.
Int — это типы данных, которые содержат значения от -2 147 483 648 до 2 147 483 647. Длинные также относятся к типам данных, которые содержат от -2 147 483 648 до 2 147 483 647.
Int и long похожи, но я придумал код, в котором используются два типа данных, как показано ниже:
int trigPin = 2;
int echoPin = 4;
long duration, cm, inches;
Но как узнать, когда какой тип данных использовать? Я много искал в Интернете, но я не понял, так что может кто-нибудь объяснить мне это, пожалуйста.
@roshan timsina, 👍4
Обсуждение6 ответов
Лучший ответ:
На Arduino (модели AVR) int составляет 16 бит, а не 32 бита. Таким образом, он изменяется от -32768 до +32767.
Это отличается от long, который составляет 32 бита.
Какова ширина «int» и «long» на 32-битных ARM Arduino, таких как Due?, @nanofarad
Я думаю о Due, что int - это 32 бита, то же самое и long. Например, см. [здесь] (http://forum.arduino.cc/index.php?topic=147612.msg1820257#msg1820257)., @Nick Gammon
Согласно спецификации языка C, длина int должна быть не менее 16 бит, а длина long – не менее 32 бит.
Компилятор может реализовать int как 32-битный или даже 64-битный. Компилятор может реализовать long как 64-битный или более длинный. Но компилятору не разрешается реализовывать long как 16-битный.
Так когда какой тип использовать?
Если значения, с которыми вы будете работать, могут быть представлены в пределах 16 бит, можно использовать int. Если вам нужно более 16 бит, используйте long. Если вам нужно больше 32 бит, используйте long long.
Не зацикливайтесь на особенностях компилятора и/или процессора. Как упоминалось другими, даже в рамках одного и того же ассортимента продуктов ардуино доступны 16- и 32-битные процессоры. Вместо этого доверяйте только тому, что гарантирует стандарт.
Полная спецификация типов в C:
charдолжен быть не менее 8 бит.
Длина intдолжна быть не менее 16 бит.longдолжен быть не менее 32 бит.
Длина long longдолжна быть не менее 64 бит.
Примечание. Для компиляторов совершенно законно реализовывать char, int, long и long long как 64-битные. На самом деле это не редкость среди DSP.
Также: прочитайте документацию вашего компилятора, @slebetman
И: sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long) согласно стандарту. Таким образом, если int равно 64 битам, то и long также должно быть не менее 64 бит., @Residuum
Мне нравится использовать типы из stdint.h.
Хотя у них есть небольшие недостатки, их преимущество заключается в том, что вы точно знаете размер, с которым работаете, даже при компиляции на других архитектурах.
#include <stdint.h>
uint8_t my_byte = 0xf0;
int16_t trig_pin = 2;
int16_t echo_pin = 4;
uint32_t duration, cm , blah;
uint64_t big_int;
// так далее.
Но очевидно, что вы не хотите перемещаться по множеству int32_t, когда вашим данным нужен только int16_t.
Значит, неиспользование размера машинного слова не влияет на производительность AVR?, @René
@René - Как правило, неиспользование размера слова может повлиять на производительность большинства процессоров. Но традиционно процессоры AVR имеют 8-битные регистры и аккумуляторы с некоторыми 16-битными инструкциями для операций с указателями. Поэтому, когда я программирую, я сначала запускаю код, а затем оптимизирую скорость, если она слишком медленная., @Kingsley
@René - Но если вы действительно хотите быть педантичным в этом, вы можете использовать «слово» в качестве типа данных. Это 16 бит на Arduino Uno и 32 бита на Arduino Due & Zero. Но это возвращает к проблеме знания только минимального размера вашего типа данных. Скажем, вы используете word в каком-то коде Due, но затем хотите сделать обратный порт на Uno?! Использование uint32_t вместо этого решит эту проблему до ее запуска, но да, это будет неоптимальный размер слова в Uno. А как насчет плат _future_ Arduino... какой размер слова у них будет? 32? 64? 128!?, @Kingsley
ХОРОШО. Поэтому я бы использовал размер машинного слова (int? WORD кажется устаревшим определением типа Windows), если нижний предел достаточен, меня не волнует размер памяти и мне нужна скорость, *_t если меня волнует размер?, @René
отказаться от этого ... http://www.gnu.org/software/libc/manual/html_node/Integers.html говорит, что *fast*_t, кажется, путь..., @René
@ Рене - Да. Кроме того, когда вы упаковываете структуры, убедитесь, что вы упаковываете все переменные в границы размера слова. Таким образом, полноразмерные слова вверху, любые одиночные символы или логические значения внизу., @Kingsley
То же рассуждение, что и в C: ожидается, что размер типа int будет естественным размером слова, который ваша система обрабатывает наиболее эффективно. Он также должен иметь ширину не менее 16 бит, не меньше short и не больше long.
Поэтому int может быть 16-, 32- или 64-битным, в зависимости от того, что лучше всего обрабатывает ваша система, и поэтому, скорее всего, будет 16-битным на 8- или 16-разрядный ЦП, 32 на 32-разрядном ЦП и т. д.
Я использую int, когда мне нужна наилучшая производительность, в то же время заботясь о защите, когда мне нужен больший диапазон, чем предлагает 16 бит. В наши дни вы, как правило, знаете, когда пишете код приложения для 16-разрядных систем, хотя это не так верно для «библиотечного» кода, где переносимость может иметь большее значение.
В вашем примере, если предположить, что автор тщательно выбрал их типы, переменные int, вероятно, требуют небольшого диапазона и могут позволить себе иметь размер слова, что может привести к потенциально более короткому или более быстрому коду (или к тому и другому). ). Предположительно, для long требуется более 16-битный диапазон (они гарантированно имеют ширину не менее 32 бит). На процессоре, который вы выбрали в качестве цели компиляции, похоже, что int и long были реализованы как 32-разрядные; это было бы иначе (или должно быть), если бы вы выбрали 16-битный целевой ЦП.
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Как работать с аналоговыми контактами в цикле?
- Какие есть другие IDE для Arduino?
- Как использовать переменные и функции в нескольких файлах .ino
- Разница между void setup() и void setup(void)
- Получение имени перечисления из экземпляра перечисления

_"Int — это типы данных, которые содержат от -2 147 483 648 до 2 147 483 647"_ Где вы это услышали?, @Lightness Races in Orbit