Различные размеры int на моем компьютере и Arduino - PullRequest
3 голосов
/ 21 июля 2010

Я работаю над проектом в свободное время, создавая некоторый код сервера для Arduino Duemilanove, но перед тем, как тестировать этот код на контроллере, я тестирую его на своей собственной машине (MacBook на основе OS X).В некоторых местах я использую int, и я обеспокоен тем, что это приведет к странным ошибкам, когда код будет скомпилирован и запущен на Arduino Duemilanove, потому что Arduino обрабатывает int как 2 байта, а мой macbook обрабатывает int как 4 байта.Я не хардкорный программист на C и C ++, поэтому я немного волнуюсь, как опытный программист справится с этой ситуацией.Должен ли я ограничить код с помощью typedef, который заключает в себе мое собственное определение, и int, который ограничен 2 байтами?Или есть другой путь?

Ответы [ 5 ]

11 голосов
/ 21 июля 2010

Лучше всего использовать заголовок stdint.h. Он определяет typedefs, которые явно ссылаются на подпись и размер ваших переменных. Например, 16-разрядное целое число без знака равно uint16_t. Он является частью стандарта C99, поэтому доступен практически везде. См:

http://en.wikipedia.org/wiki/Stdint.h

6 голосов
/ 21 июля 2010

Стандарт C определяет int как тип со знаком, достаточно большой, чтобы, по крайней мере, содержать все целые числа от -32768 до 32767 - реализации могут выбирать более крупные типы, и любая современная 32-битная системавыберите 32-разрядное целое числоОднако, как вы видели, некоторые встроенные платформы по-прежнему используют 16-битные целочисленные значения.Я бы рекомендовал использовать uint16_t или uint32_t, если ваш компилятор Arduino поддерживает это;если нет, используйте макросы препроцессора, чтобы самостоятельно определить эти типы.

4 голосов
/ 21 июля 2010

Правильный способ справиться с ситуацией - выбрать тип на основе значений, которые он должен представлять:

  • Если это общее маленькое целое число, а диапазон от -32767 до 32767 в порядке, используйте int;
  • В противном случае, если диапазон от -2147483647 до 2147483647 в порядке, используйте long;
  • В противном случае используйте long long.
  • Еслидиапазон от -32767 до 32767 в порядке , а эффективность использования пространства важна , используйте short (или signed char, если диапазон от -127 до 127 в порядке).

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

В общем, вам нужно только использоватьтипы фиксированной ширины от stdint.h для значений, которыми обмениваются через двоичный интерфейс с другой системой - т.е.чтение или запись в сеть или файл.

2 голосов
/ 21 июля 2010

Вам понадобятся значения меньше -32 768 или больше + 32 767?Если нет, игнорируйте разные размеры.Если они вам нужны, есть stdint.h с целыми числами фиксированного размера, singny и unsigned, называемые intN_t / uintN_t (N = количество бит)Это C99, но большинство компиляторов его поддержат.Обратите внимание, что использование целых чисел, размер которых превышает размер слова процессора (в данном случае 16-битный), снизит производительность, поскольку нет никаких собственных инструкций для их обработки.

0 голосов
/ 21 июля 2010

избегайте использования типа int, так как его размер может зависеть от архитектуры / компилятора.

используйте short и long вместо

...