Конвертировать -10 в строку

Тема в разделе "ESP8266, ESP32", создана пользователем Vovka, 24 окт 2020.

  1. issaom

    issaom Гуру

    В 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 любой программер должен в уме выполнять :D
     
  2. b707

    b707 Гуру

    А по-моему, все верно. Как по Вашему функция принт понимает, хотите ли вы напечатать байт 65 как число или как литеру 'A' ? - только по типу передаваемого ей аргумента
     
    SergeiL нравится это.
  3. issaom

    issaom Гуру

    ну значит char != int8_t , (хотя и то и то со знаком и занимает один байт), а если в справку по Arduino заглянуть:

    что по факту получается вранина. А штатного типа данных аналогичному int8_t я вообще не в одном справочнике по Arduino не видел.
     
  4. issaom

    issaom Гуру

    гы:
    Код (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 и не думать )))
     
  5. Vovka

    Vovka Гик

    А если посмотреть в каком разделе эта тема создана?
     
  6. SergeiL

    SergeiL Оракул Модератор

    А что это доказывает?
    Думаете int и signed int тоже отличаются?
     
  7. Asper Daffy

    Asper Daffy Иксперд

    В этом и есть главная ошибка. Думать всегда полезно.
     
    parovoZZ нравится это.
  8. Asper Daffy

    Asper Daffy Иксперд

    А по факту так и есть. Открываем файл stdint.h и видим:

    Код (C++):
    typedef signed char int8_t;
     
  9. SergeiL

    SergeiL Оракул Модератор

    Нужно явно указывать формат ввода, и вопросов не будет.
    Поэтому использую printf(), sprintf(). Тут таких вопросов не возникает.
    А Serial.print() я использую только во время отладки.
     
  10. SergeiL

    SergeiL Оракул Модератор

    upload_2020-10-25_9-23-39.png
    Тут все завит от конкретного компилятора и платформы под которую компилируется код.
    Лучше использовать uint8_t и int8_t тогда с размерностью будет однозначность.
    Посмотрел свои старые Help-ы тогда было char = signed char:
    upload_2020-10-25_9-28-6.png
     
    parovoZZ и issaom нравится это.
  11. parovoZZ

    parovoZZ Гуру

    Сам-то внимательно читал? Говоришь про char, а приводишь определение signed char.
     
  12. parovoZZ

    parovoZZ Гуру

    А кстати, в дурине под ESP каким компилятором собирается программа?
     
  13. parovoZZ

    parovoZZ Гуру

    Мы же меняем диапазон при присвоении значения переменной. Ругаться должен на неявное приведение типов. Но если компилятор те две строчки просто выкинул, то ругаться не должен.
     
  14. Un_ka

    Un_ka Гуру

    Может в библиотеке Ардуино перезагрузка функции:
    Код (C++):
    Ля::print (char lit)
    {
    //Вывод как символ
    }
    Ля::print (uint_8t lit)
    {
    lit=lit+'0';
    //Вывод как число

    }
     
    Код (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);
    Код (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.
     
  15. Asper Daffy

    Asper Daffy Иксперд

    Вообще-то это определение int8_t :)

    signed char определять не надо, он в язык встроен.
     
    Andrey12 нравится это.
  16. Asper Daffy

    Asper Daffy Иксперд

    Я спросил на какую конкретно строчку. Если ты её приведёшь, я могу пояснить что там и как. А потоков сознания мне не надо.

    Ты ведь не знаешь языка и пишешь какой-то бред. С какого перепугу он
    Кому это он так задолжал? Неявное преобразования типов - фундаментальное свойство этого языка, с какого бодуна на него ругаться-то?
     
  17. Asper Daffy

    Asper Daffy Иксперд

    Ну, или уметь готовить Serial.print :)

    Я был готов рассказать в чём там фишка, но ТС полез в бутылку ... значит, лесом.
     
    Andrey12 нравится это.
  18. parovoZZ

    parovoZZ Гуру

    ну да))

    при попытке положить в байтовую переменную integer получаем предупреждение
    вот эта перетасовка переменных
     
  19. Asper Daffy

    Asper Daffy Иксперд

    Не при попытке, а только при отбрасывании части числа. Если отбрасывания не происходит - никаких проблем.
    Ну, там нет ничего, на что можно было бы ругаться. Даже вот в такой, казалось бы совсем наглой записи
    Код (C++):
        unsigned a;
        a = -10;
     
    на самом деле нет никакого криминала. Причём это не особенность компилятора, а именно свойство языка.

    Тебе правда интересно что там происходил? Я могу расписать, но это полчаса возни. Если и вправду будешь разбираться и вникать, напишу, если нет - может нафиг тогда?
     
  20. parovoZZ

    parovoZZ Гуру

    а скажи мне: почему взятие указателя на константу во 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 -ся?
     
    Последнее редактирование: 27 окт 2020
    Andrey12 нравится это.