Почему int только 2 байта?

9

При использовании C / C ++ на других платформах intтип обычно составляет 4 байта (или, возможно, больше). Однако на Arduino это всего 2 байта.

Почему это отличается? Влияет ли это на производительность, если я всегда использую 4 байта long?

Питер Блумфилд
источник
2
обратите внимание, что intна Arduino Due 4 байта. A shortбудет 2 байта на всех существующих Ardunios, но я подчеркиваю совет других использовать int16_tили uint16_t.
Рон

Ответы:

10

ATmega328, используемый во многих Arduinos, является 8-битным микроконтроллером. Это означает, что регистры 8-битные, шина данных 8-битная, порты 8-битные. Есть несколько минимальных 16-битных аспектов системы (например, один из таймеров), но почти все 8-битные.

Поэтому большинство операций обрабатывают 8 бит за раз. Работа с чем угодно, кроме 8-битных (т.е. 16-битных или 32-битных целых чисел и чисел с плавающей запятой) требует того, что по сути можно назвать программной эмуляцией, где компилятор использует несколько инструкций для работы с этими более крупными переменными.

8-битный, очевидно, достаточно для адресации 8-битного порта. Также достаточно иметь дело со многими счетчиками циклов, возвращаемыми значениями и символами ASCII. Это не совсем достаточно, хотя при работе с числами. 8-битный int со знаком (int8_t) может представлять только -128 -> +127. Без знака (uint8_t) может представлять только 0 -> 255.

8-битные целые числа довольно ограничены. В C / C ++ int должно быть не менее -32,678 -> +32,767, поэтому отображается на int16_t - наименьший размер, который может это сделать. Это дает хороший баланс дальности и эффективности. Это особенно важно, когда начинающие учатся - переполнение на самом деле не то, что непрограммисты понимают.

Однако это влияет на производительность, поскольку большинство 16-разрядных операций занимают как минимум вдвое больше, чем 8-разрядные операции, и используют в два раза больше регистров. Это может или не может иметь значение для вас.

Многие из нас переключаются на нативные типы, такие как int8_t и uint8_t, поскольку это дает вам гораздо больше контроля.

Cybergibbons
источник
3
Примечание: не команда Arduino сопоставила int с int16_t, int - зарезервированное ключевое слово C / C ++, а сопоставление типов является частью ABI ( gcc.gnu.org/wiki/avr-gcc ), которую Разработчики компилятора avr-gcc решили последовать примеру. Еще одно заметное отличие заключается в типе "double", который обычно имеет ширину 64 бита, а в avr-gcc он 32-
битный
Спасибо. Не уверен, почему я это написал. Я знаю, что int должен представлять 32 678 -> + 32 767 (хотя, на самом деле, я думаю, что был проприетарный компилятор для одного из процессоров NEC, который не следовал этому). Я думаю, это потому, что мне не нравится скрывать ширину во встроенных системах - использование int16_t намного понятнее.
Cybergibbons
1
+1 за использование понятных нативных типов! На Arduino Due int32-битный! arduino.cc/en/Reference/int
Рон
3

Важным фактом в языках C и C ++ является то, что их соответствующие стандарты не определяют размер (в байтах) целочисленных типов и чисел с плавающей запятой.

Они просто определяют минимальные диапазоны и отношения между этими диапазонами, например

range(short) <= range(int) < range(long)

Таким образом, размер, например, intбудет зависеть от:

  • целевая платформа (процессор)
  • сам компилятор
jfpoilpret
источник
ты говоришь sizeof(short) == sizeof(int) == sizeof(long), возможно?
Рон
@ ron-e Теоретически, да, это было бы возможно. На практике, однако, я никогда не видел этого. В большинстве компиляторов / платформ можно ожидать (хотя это не навязывается) этого sizeof(short) < sizeof(long).
jfpoilpret