В Arduino IDE есть прикол..... Код (C++): void setup() { Serial.begin(115200); delay(2000); char sc = 'A'; int8_t si = 'A'; uint8_t sI = 'A'; Serial.println(sc); Serial.println(si); Serial.println(sI); } Вернет в монитор порта вот такую хрень.... Код (Text): 23:24:47.794 -> A 23:24:47.794 -> 65 23:24:47.794 -> 65 Вроде, как бы char = int8_t, а по факту..... Может это конечно тараканы Arduino, но после такого я тоже везде предпочитаю int8_t и uint8_t юзать..... тем более что операции 2^8 2^16 и 2^32 любой программер должен в уме выполнять
А по-моему, все верно. Как по Вашему функция принт понимает, хотите ли вы напечатать байт 65 как число или как литеру 'A' ? - только по типу передаваемого ей аргумента
ну значит char != int8_t , (хотя и то и то со знаком и занимает один байт), а если в справку по Arduino заглянуть: что по факту получается вранина. А штатного типа данных аналогичному int8_t я вообще не в одном справочнике по Arduino не видел.
гы: Код (C++): void setup() { Serial.begin(115200); delay(2000); char ch1 = 'A'; signed char ch2 = 'A'; Serial.println(ch1); Serial.println(ch2); } Код (C++): 00:19:36.874 -> A 00:19:36.874 -> 65 Поэтому, в данном случае соглашусь с @parovoZZ лучше юзать uint8_t и int8_t и не думать )))
Нужно явно указывать формат ввода, и вопросов не будет. Поэтому использую printf(), sprintf(). Тут таких вопросов не возникает. А Serial.print() я использую только во время отладки.
Тут все завит от конкретного компилятора и платформы под которую компилируется код. Лучше использовать uint8_t и int8_t тогда с размерностью будет однозначность. Посмотрел свои старые Help-ы тогда было char = signed char:
Мы же меняем диапазон при присвоении значения переменной. Ругаться должен на неявное приведение типов. Но если компилятор те две строчки просто выкинул, то ругаться не должен.
Может в библиотеке Ардуино перезагрузка функции: Код (C++): Ля::print (char lit) { //Вывод как символ } Ля::print (uint_8t lit) { lit=lit+'0'; //Вывод как число } Спойлер: Print.h Код (C++): size_t print(const __FlashStringHelper *); size_t print(const String &); size_t print(const char[]); size_t print(char); size_t print(unsigned char, int = DEC); size_t print(int, int = DEC); size_t print(unsigned int, int = DEC); size_t print(long, int = DEC); size_t print(unsigned long, int = DEC); size_t print(double, int = 2); size_t print(const Printable&); size_t println(const __FlashStringHelper *); size_t println(const String &s); size_t println(const char[]); size_t println(char); size_t println(unsigned char, int = DEC); size_t println(int, int = DEC); size_t println(unsigned int, int = DEC); size_t println(long, int = DEC); size_t println(unsigned long, int = DEC); size_t println(double, int = 2); size_t println(const Printable&); size_t println(void); Спойлер: Print.cpp Код (C++): size_t Print::print(char c) { return write(c); } size_t Print::print(unsigned char b, int base) { return print((unsigned long) b, base); } Библиотека на Github.
Я спросил на какую конкретно строчку. Если ты её приведёшь, я могу пояснить что там и как. А потоков сознания мне не надо. Ты ведь не знаешь языка и пишешь какой-то бред. С какого перепугу он Кому это он так задолжал? Неявное преобразования типов - фундаментальное свойство этого языка, с какого бодуна на него ругаться-то?
Ну, или уметь готовить Serial.print Я был готов рассказать в чём там фишка, но ТС полез в бутылку ... значит, лесом.
ну да)) при попытке положить в байтовую переменную integer получаем предупреждение вот эта перетасовка переменных
Не при попытке, а только при отбрасывании части числа. Если отбрасывания не происходит - никаких проблем. Ну, там нет ничего, на что можно было бы ругаться. Даже вот в такой, казалось бы совсем наглой записи Код (C++): unsigned a; a = -10; на самом деле нет никакого криминала. Причём это не особенность компилятора, а именно свойство языка. Тебе правда интересно что там происходил? Я могу расписать, но это полчаса возни. Если и вправду будешь разбираться и вникать, напишу, если нет - может нафиг тогда?
а скажи мне: почему взятие указателя на константу во FLASH требует тогда приведение типа? константу Код (C++): const uint8_t ConfArray[] = RADIO_CONFIGURATION_DATA_ARRAY; в функцию Код (C++): inline void Radio_Init(uint8_t *pArray) приходится передавать так Код (C++): Radio_Init((uint8_t*)ConfArray); И вопрос абсолютно не по теме: как происходит inline функций? Inline одних функций приводит к уменьшению кода, других - к увеличению. Причём сразу так байт на 50. Все функции вызываются однократно, но внутри этих функций есть вызов других (не inline) функций. Может, они тоже inline -ся?