конвертция uint8_t в String

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, уж холивар тут у вас. Главное, с умным видом привлекает С99 - хотя в ардуино используется С++, а концепции char в C и C++  совершенно различны!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Обьясните нам, смертным?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, чё там объяснять, холивар как всегда из ничего вылез.

Давай я тебе скажу конкретно по твоему посту, а в свару не полезу.

Вот ты пишешь.

DetSimen пишет:
По умолчанию, в Си тип char - знаковый

Это распространённое заблуждение, вернее, устаревшие сведения. Так было во времена K&R. Уже в С'99 (и уж тем более в C'18) это не так. Вот тут уже полоскалась ссылка на С'99. Открой страницу 47 (по файлу, по нумерации она 35-ая) и посмотри первый абзац и примечание 35 к нему. Как видишь в языке не определено знаковый тип char или беззнаковый - это оставлено на реализацию и в примечании  даже написано как определить какой тебе попался.

Там есть ещё одно очень важное замечание в примечании: независимо от того как реализован char (знаково или беззнаково) char, signed char и unsigned char - это три разных типа и char по любому не является синонимом никакого из двух оставшихся. Эта же мысль ещё более чётко высказана в С++'17: "Plain char, signed char, and unsigned char are three distinct types" (6.9.1(1)). Заметь, с int'ом и long'ом это не так, а char вот такой особенный.

Что же касается всего остального, то в языке как таковом (хоть в C, хоть в C++) нет никаких byte, uint8_t. Он определены в реализации так, как определены и чего их обсуждать?.Ты сам в любой программе свои типы определяешь, так у них такой же статус. как и у byte - о чём говорить-то? Как определили, так и определили.

Другое дело, что в С++ (в отличие от С) есть интересные типы char16_t и char32_t (5.1 на стр. 28 - список ключевых слов). Повторяю, они есть именно в языке, а не в реализации. Вот на них как раз и делаются расширенные (и переменной длины) UTF'ы.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DetSimen пишет:

По умолчанию, в Си тип char - знаковый...

Что я делаю не так?

void setup() {
  Serial.begin(115200);
  while(!Serial);
  char ch0 = 129;
  signed char ch1 = 129;
  unsigned char ch2 = 129;
  Serial.print("char: ");
  Serial.println((int)ch0);
  Serial.print("signed char: ");
  Serial.println((int)ch1);
  Serial.print("unsigned char: ");
  Serial.println((int)ch2);
}

void loop() {
}

результат:

char: 129
signed char: -127
unsigned char: 129
 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну вот, теперь понятно хоть, что в толкователи стандартов я не гожусь.  Спасибо.

to nik182  - сдаюсь, признаЮ, что был неправ, пал жертвой горьких заблуждений.  :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Слава богу, что intN_t / uintN_t оставили в C17/C18 c exact width, а то я уж подумал, что реформы и до него добрались: "7.20.1.1 Exact-width integer types ..."

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Ну вот, теперь понятно хоть, что в толкователи стандартов я не гожусь.  Спасибо.

to nik182  - сдаюсь, признаЮ, что был неправ, пал жертвой горьких заблуждений.  :)

меня интересует только одно, если чары сложить, что будет, говорил жеж лживый ваш СИ...а другого нет )))

Densl
Offline
Зарегистрирован: 28.11.2018

andriano пишет:

DetSimen пишет:

По умолчанию, в Си тип char - знаковый...

Что я делаю не так?

void setup() {
  Serial.begin(115200);
  while(!Serial);
  char ch0 = 129;
  signed char ch1 = 129;
  unsigned char ch2 = 129;
  Serial.print("char: ");
  Serial.println((int)ch0);
  Serial.print("signed char: ");
  Serial.println((int)ch1);
  Serial.print("unsigned char: ");
  Serial.println((int)ch2);
}

void loop() {
}

результат:

char: 129
signed char: -127
unsigned char: 129
 

Кстати да, хоть числа одни и те же *char и *byte действительно разные типы. Сегодня столкнулся с этим когда передавал их в сериал.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Densl пишет:
*char и *byte действительно разные типы. Сегодня столкнулся
И для кого я писал #53? Только для деда? Так он бы и сам разобрался.

Densl
Offline
Зарегистрирован: 28.11.2018

ЕвгенийП пишет:

Densl пишет:
*char и *byte действительно разные типы. Сегодня столкнулся
И для кого я писал #53? Только для деда? Так он бы и сам разобрался.


На примере понятней стало что за типы у них). byte это код символов, а char сами символы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Densl пишет:
byte это код символов, а char сами символы.
Ну, ладно, раз так :-)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Немножечко в дополнение к сказанному: на AVR тип char реализован как знаковый, а на ARM - как беззнаковый. Так что даже в пределах только Ардуины неопределенность типа проявляется во всей красе. Поэтому программы надо писать так, чтобы им было безразлично, знаковым или беззнаковым типом является char.

Ну, например, в какой-то теме про кириллические шрифты рекомендовался код, в котором переменная типа char сравнивалась на больше/меньше с нулем. Так делать не следует, если нужно проверить старший бит, то именно старший бит и нужно проверять, не предполагая, что он является знаковым.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
void func(const char a) {
  Serial.println("char");
}
void func(const unsigned char a) {
  Serial.println("unsigned char");
}
void  func(const signed char a) {
  Serial.println("signed char");
}

void setup() {
  Serial.begin(9600);
  byte b = 10; //<-- вставляйте нужный тип и определяйте какой у вас char
  func(b);
}

void loop() {


}

 

Logik
Offline
Зарегистрирован: 05.08.2014

Знаковый или нет char задается в настройках компилятора. Конкретно gcc

-funsigned-char

Заменяет любой неквалифицированный специально тип char на unsigned char. Без этой опции по умолчанию char соответствует signed char.

И так было всегда и везде. Тока опции в названии менялись. Это всегда было некоторой, но не большой проблемой (не собрался чужой код и похоже ругается на char - не нужно думать, меняем настройку на противоположную и пробуем). Потому кстати и в стандарте char ни на один из вариантов не опирается, потому как ХЗ что там програмер у ся настроит. И почему по умолчанию знаковый тож понятно - опция сама не впишется в проект. Бардак и очень древний, все привыкли.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Logik пишет:
char соответствует signed char

"char" и  "signed char" - разные типы. Ничто ничему не соответствует. Правильно было сказать "char является знаковым"

Logik
Offline
Зарегистрирован: 05.08.2014

Это твое личное мнение не совпадающее с мнением разработчиков нашего компилятора. Я привел цитату перевода описаний опций. Почему он не соответствует вообще, но соответствует у каждого конкретного проекта думаю всем ясно. Ну кроме одаренных ;)

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Logik пишет:

Это твое личное мнение 

Это не моё личное мнение, а стандарт языка (и С, и С++). Точные цитаты из стандартов, где это прямо написано,  с указанием страниц приведены выше в #53. Впрочем, я понимаю, что настоящим "одарённым" прогерам стандарт - не авторитет - они пользуются википедией.

Logik
Offline
Зарегистрирован: 05.08.2014

Не авторитет конечно. Стандарт мне ни один проект не собрал. А gcc собрал. Стандарты стали крутить как хотят, особенно в последнее время и они теперь - ни о чем. Что и подтверждает это обсуждение. И VC мне проекты собирает. Изучай реальность - https://docs.microsoft.com/en-us/previous-versions/0d294k5z%28v%3dvs.85%29 Стандарты потом под неё поправят. Это не сложно. Это не софт писать. 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Ну, я, собственно, так и думал. С Новым Годом тебя!

Logik
Offline
Зарегистрирован: 05.08.2014

И тебе наилучшего! Старайся без криминала в наступившем!