Разница между типом данных 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;

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

, 👍4

Обсуждение

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


6 ответов


Лучший ответ:

8

На 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


4

int в AVR GCC составляет 16 бит, не 32.

,

5

Согласно спецификации языка 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


2

Мне нравится использовать типы из 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


3

То же рассуждение, что и в 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-битный целевой ЦП.

,

0

если вы используете платы Esp32 в Arduino IDE:

,