Почему Arduino IDE рекомендует хранить числа 0-255 в «byte», а не «char»?
Недавно я столкнулся с типом данных byte
. Мои познания в C/C++ невелики, но я знаю char
и не смог найти много информации о byte
в документации по C++. Я посмотрел это в документах Arduino:
Рекомендуется использовать char только для хранения символов. Для беззнаковый, однобайтовый (8-битный) тип данных, используйте байтовый тип данных.
Является ли тип данных byte
исключительно конструкцией Arduino? Если да, то почему его рекомендуют вместо char
? Оба 8-битные, так какая разница?
@Arthur Tarasov, 👍1
Обсуждение2 ответа
Лучший ответ:
Является ли тип данных byte исключительно конструкцией Arduino?
Да. Большая часть «языка» Arduino «согнута», чтобы выглядеть как Java, поскольку она возникла из Processing, то есть Java. Таким образом, у нас есть типы данных, "выглядящие как" Java, включая "byte" для "unsigned char" и "boolean" для "bool".
Если да, то почему его рекомендуется использовать вместо char?
Лично я никогда не рекомендую его использовать, так как он нестандартен. Вместо этого вы должны использовать uint8_t
, который по сути является тем же самым, но переносимым.
Для переносимости рекомендуется использовать типы данных с жесткой подписью. Проблема с char
заключается в том, что независимо от того, подписан он или нет, полностью зависит от реализации компилятора. Некоторые системы имеют его как подписанный, некоторые как неподписанный. Используя byte
(или лучше uint8_t
), вы всегда будете получать 8-битное значение без знака.
Для простого хранения двоичных данных это не имеет большого значения, но когда дело доходит до математических операций с сохраненными данными, вы можете неожиданно обнаружить отрицательные значения, когда вам не нужны отрицательные значения ( char
может хранить ваше число как от -128 до +127, а не от 0 до 255).
Отличное объяснение. В будущем я буду придерживаться конкретного unit8_t
и вернусь и рефакторинг своих "символов". Я предпочитаю придерживаться синтаксиса C/C++, чем блуждать по Java и иметь другой язык, в котором можно быть поверхностным., @Arthur Tarasov
Небольшое дополнение к ответу Маженко:
Если функция имеет параметр char*, она обычно ожидает текст, заканчивающийся нулем.
Если функция имеет параметр byte*, обычно это любые двоичные данные, в конечном итоге содержащие '\0' байтов. В этом случае размер буфера должен быть дополнительным параметром.
Если больше нечего учитывать, почему бы не использовать это и для определения вашей переменной:
Используйте char
, только если он содержит 8-битный символ. Или что-то вроде char text[]="hello";
Для двоичных данных может иметь значение, являются ли они подписанными (int8_t) или беззнаковыми (uint8_t).
"обычно" подразумевает, что вы должны прочитать документ.
- Как получить тип данных переменной?
- Преобразование в Unix Timestamp и обратно
- Невозможно создать массив типа const char*
- ардуино - миллисекунды ()
- Ошибка Cast from 'char*' to 'uint8_t {aka unsigned char}' loses precision [-fpermissive]
- Получение шестнадцатеричных данных с терминала
- Какой тип данных Arduino допускает десятичные дроби?
- Поскольку double и float представляют один и тот же тип данных (обычно), что предпочтительнее?
char настроен как подписанный в настройках компилятора ядер Arduino Arduino, @Juraj
Всякий раз, когда я делаю что-то большее, чем просто 50 строк, я всегда использую самые конкретные типы, такие как: uint8_t, int8_t, uint16_t, int16_t, uint32_t и int32_t, чтобы точно знать, что знаковое или беззнаковое, и если это 8, 16 или 32 бита. И я использую char для символов и bool для логических значений. В этом случае вам никогда не придется думать, что подходит (или должно соответствовать) в переменной., @Michel Keijzers