При использовании C / C ++ на других платформах int
тип обычно составляет 4 байта (или, возможно, больше). Однако на Arduino это всего 2 байта.
Почему это отличается? Влияет ли это на производительность, если я всегда использую 4 байта long
?
При использовании C / C ++ на других платформах int
тип обычно составляет 4 байта (или, возможно, больше). Однако на Arduino это всего 2 байта.
Почему это отличается? Влияет ли это на производительность, если я всегда использую 4 байта long
?
Ответы:
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, поскольку это дает вам гораздо больше контроля.
int
32-битный! arduino.cc/en/Reference/int
Важным фактом в языках C и C ++ является то, что их соответствующие стандарты не определяют размер (в байтах) целочисленных типов и чисел с плавающей запятой.
Они просто определяют минимальные диапазоны и отношения между этими диапазонами, например
range(short) <= range(int) < range(long)
Таким образом, размер, например, int
будет зависеть от:
sizeof(short) == sizeof(int) == sizeof(long)
, возможно?
sizeof(short) < sizeof(long)
.
int
на Arduino Due 4 байта. Ashort
будет 2 байта на всех существующих Ardunios, но я подчеркиваю совет других использоватьint16_t
илиuint16_t
.