Char to int - как перевести?

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
95
9
Здравствуйте, подскажите пожалуйста, как получить int значение 11 если оно приходит через char 11 ?
Если отправляю char test = '1';
int test1 = test - 48; // получаю цифру 1
с етим понятно, а вот если char test = '11';
то как получить в int test1 = 11 ?
Попробывал = пише мне как на '1' = 49, я думал напишет 4949 или как-то еще, как быть ?)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
char это один символ, т.е. "11" быть не может, а может быть "0"-"9" , и да, предложенный вариант с вычетом 48 для этой цели подойдет.
Если char[], то другое дело.
Надо четко понимать разницу.
Как быть с массивом.
1. Массив должен быть или полностью заполнен, или быть 0-терминирован. Т.е. последний символ массива должен иметь код 0 (не символ "0" с кодом 48)
2. Проверить весь массив до нуля или до последнего символа, что бы состоял только из символов с кодами от 48 до 57 (это символы с "0" до "9") , это справедливо до 10-ой системы исчисления.

Ну и сам алгоритм:
1) результат считаем 0
2) берем символ, если символ не имеет код 0, то результат умножаем на 10 и к нему (результату) прибавляем код символа -48. Если код==0, то идем на пункт 4.
3) идем на пункт 2
4) Готово.

Это упрощенный алгоритм для целых чисел, исключительно для примера.
 
  • Лойс +1
Реакции: Sem553

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
95
9
@Sergo_ST, не подходит,
char это один символ, т.е. "11" быть не может, а может быть "0"-"9" ,
@Старик Похабыч, так сделать:
C++:
char test[2] = {0};
int test1[2] = {0};
  for (int i = 0; i < static_cast<int>(count); ++i) {
    char test[i] = (static_cast<char>(buf[i]));
if(test[i] != 0) {
test1[i] = test[i] * 10 - 48;
} else if(test[i] == 0) {
}
Serial.println(test[0]&test[1]);
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
А хотите я вас ещё больше запутаю?
Char - это unsigned int. Принимающий значение от 0 до 255.
Ноль обычно не используется.
И "0"-"9" это 30 - 39.
И нафига char переводить в int?
Даже в пьяном бреду представит не могу.
 
  • Лойс +1
  • Ахах! +1
Реакции: Sem553 и PiratFox

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
95
9
в принципе разобрался, нужно теперь понять как сделать что бы получилось так:
int test[2] = {1,2};
int test1 = test[0] && test[1];
Serial.println(test1); // тут должно написать 12, как сделать так?)))
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
Это совершенно не те операции, что бы получить что надо.
В Ардуино есть функция print(<test>, DEC).
Посмотрите как это реализовано. Может поймёте, что к чему.
А операция && используется в условиях. Математикой здесь не пахнет.
И вам уже ответили в первом же сообщении после вашего.
 

kakmyc

✩✩✩✩✩✩✩
7 Окт 2020
35
8
Я почему то привык писать не -48, а -'0' . Так понятнее о чем идёт речь.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
Kern_Ritch Язык программирования Си
Страница 41
char — единичный байт, который может содержать один символ из допустимого символьного набора;
Квалификаторы signed (со знаком) или unsigned (без знака) можно применять к типу char и любому целочисленному типу.
Так, если значению char отводится 8 битов, то unsigned char имеет значения в диапазоне от 0 до 255, a signed char — от -128 до 127 (в машине с двоичным дополнительным кодом). Являются ли значения типа просто char знаковыми или беззнаковыми, зависит от реализации, но в любом случае коды печатаемых символов положительны.
И просто от себя. Тип char похож на uint8_t, но uint8_t не всегда его может заменить. И если кто то отступает от классики, это ещё не означает, что это верно
 
Изменено:
  • Лойс +1
Реакции: Stamp и Boroda22

ТехнарьКто

★★★★★✩✩
13 Янв 2020
273
435
@rGlory,

Про char в С++ в отрыве от ардуино.
Символ строки может быть представлен в виде 1-го байта и 2-х байтов.
Обычно одно-байтовый символ это символ кодировки ANSI- в этой кодировке представлены английские символы. А 2-х байтовый символ это кодировка UNICODE в которой представлены остальные языки.

Компилятор Visual C++ поддерживает char и wchar_t как встроенные типы данных для кодировок ANSI и UNICODE.Хотя есть более точное определение Юникода. Но Windows использует 2-х байтовую кодировку для много языковой поддержки приложений.

CHARACTER SET.png

Если указан параметр «Use Unicode Character set», тип TCHAR будет транслироваться в тип wchar_t. Если указан параметр «Use Multi-byte character set» то тогда TCHAR будет транслироваться в тип char.

В данном случае, если английским было написано "Использовать много байтовый набор символов" то за 16 бит или 2 байта будет отвечать char.

И да, есть еще char8_t, char16_t и char32_t. Но опять же это всего навсего 1, 2 и 4 байта в которых всегда по 8 бит.

PS Мужики, а Вы точно тут программисты? А то мне как железячнику просто неудобно программистам, рассказывать про программирование.
 

SergejEU

★★✩✩✩✩✩
16 Сен 2020
120
70
в любом случае коды печатаемых символов положительны
это потому, что код ASCII 97 использует только половину из 256 отведенных ему значений, если речь идет о расширении стандартной таблицы, то здесь возможны варианты..
Для тех, кто кодит под MS VS С++, должел явно/explicit/ указать компилятору что подразумевается под типом char по умолчанию:

Значения символов типа unsigned char находятся в диапазоне от 0 до 0xFF. signed char имеет диапазон от 0x80 до 0x7F. Эти диапазоны преобразуются в диапазоны от 0 до 255 и от -128 до +127 соответственно. Параметр компилятора /J указывает, что вместо signed по умолчанию будет использоваться тип unsigned..