Почему Arduino IDE рекомендует хранить числа 0-255 в «byte», а не «char»?

Недавно я столкнулся с типом данных byte. Мои познания в C/C++ невелики, но я знаю char и не смог найти много информации о byte в документации по C++. Я посмотрел это в документах Arduino:

Рекомендуется использовать char только для хранения символов. Для беззнаковый, однобайтовый (8-битный) тип данных, используйте байтовый тип данных.

Является ли тип данных byte исключительно конструкцией Arduino? Если да, то почему его рекомендуют вместо char? Оба 8-битные, так какая разница?

, 👍1

Обсуждение

char настроен как подписанный в настройках компилятора ядер Arduino Arduino, @Juraj

Всякий раз, когда я делаю что-то большее, чем просто 50 строк, я всегда использую самые конкретные типы, такие как: uint8_t, int8_t, uint16_t, int16_t, uint32_t и int32_t, чтобы точно знать, что знаковое или беззнаковое, и если это 8, 16 или 32 бита. И я использую char для символов и bool для логических значений. В этом случае вам никогда не придется думать, что подходит (или должно соответствовать) в переменной., @Michel Keijzers


2 ответа


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

3

Является ли тип данных 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


0

Небольшое дополнение к ответу Маженко:

Если функция имеет параметр char*, она обычно ожидает текст, заканчивающийся нулем.

Если функция имеет параметр byte*, обычно это любые двоичные данные, в конечном итоге содержащие '\0' байтов. В этом случае размер буфера должен быть дополнительным параметром.

Если больше нечего учитывать, почему бы не использовать это и для определения вашей переменной: Используйте char, только если он содержит 8-битный символ. Или что-то вроде char text[]="hello"; Для двоичных данных может иметь значение, являются ли они подписанными (int8_t) или беззнаковыми (uint8_t).


"обычно" подразумевает, что вы должны прочитать документ.

,