Разница между типом данных 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)
- Будет ли .ino-скетч ардуино компилироваться непосредственно на GCC-AVR?
_"Int — это типы данных, которые содержат от -2 147 483 648 до 2 147 483 647"_ Где вы это услышали?, @Lightness Races in Orbit