Конвертировать char в int в C и C ++
@Matt: было бы неплохо быть более конкретным. вопрос об обобщении просто предлагает обобщенные ответы, которые не применимы или даже не подходят для вашей задачи. имейте в виду, что когда вам приходится спрашивать, вы, вероятно, не знаете достаточно, чтобы правильно обобщать.
Cheers and hth. — Alf 17 фев. 2011, в 14:18
@Alf P. Steinbach: Первоначальный вопрос был неопределенным в отношении того, на каком языке. С ключевыми словами c и c++ , я думаю, ответы на оба языка являются разумными.
Matt Joiner 17 фев. 2011, в 14:25
Исходя из моего большого опыта работы на других технических форумах, моя интуиция заключается в том, что ОП на самом деле означает «как взять текстовое представление числа (в базе 10) и преобразовать его в соответствующее число?» Вообще говоря, неофиты C и C ++ обычно имеют невероятно смутные представления о том, как работает текст на этих языках и что на самом деле означает char .
Karl Knechtel 17 фев. 2011, в 15:56
@KarlKnechtel: Если это правда (я даю примерно 50/50, так как многие ранние руководства также поощряют получение значений ASCII из символов, даже если ASCII не охватывает весь диапазон), ОП требует ясности — но это обман of stackoverflow.com/questions/439573/… .
Fred Nurk 17 фев. 2011, в 16:51
У ОП было три часа, чтобы уточнить этот вопрос, и он не смог этого сделать. Как это, нет никакого способа узнать, что на самом деле спрашивают. Проголосовал за закрытие.
sbi 17 фев. 2011, в 17:27
Вообще-то, возможно, это что-то вроде дурака .
T.E.D. 17 фев. 2011, в 17:52
возможный дубликат символа в целое число в C
Helen 17 фев. 2011, в 19:59
Обратите внимание, что даже если вы можете выполнять неявное приведение назад и вперед, когда дело доходит до int и char, есть некоторые действительно важные вещи, которые необходимо знать: 1) в зависимости от ситуации вы можете потерять знак минус вашего числа (хранится как char) если ты не осторожен Вот почему есть знак со знаком и без знака; 2) sizeof (char) = 1Byte (всегда; здесь я исключаю символ WIDE, который может быть больше 8 бит), но sizeof (int) = не менее 4Bytes! Char — это целочисленный тип с некоторыми ограничениями. Я советую вам избегать использования char для математических вычислений, если только вам это не нужно.
rbaleksandar 17 июль 2013, в 03:21
Показать ещё 6 комментариев
Поделиться:
11 ответов
Зависит от того, что вы хотите сделать:
чтобы прочитать значение как код ascii, вы можете написать
char a = 'a'; int ia = (int)a; /* note that the int cast is not necessary -- int ia = a would suffice */
чтобы преобразовать символ ‘0’ -> 0 , ‘1’ -> 1 и т.д., вы можете написать
char a = '4'; int ia = a - '0'; /* check here if ia is bounded by 0 and 9 */
Foo Bah 17 фев. 2011, в 15:49
Поделиться
а = (а — «0»)% 48;
Kshitij Banerjee 31 окт. 2013, в 21:25
@KshitijBanerjee Это не очень хорошая идея по двум причинам: он дает вам отрицательное число для символов ascii перед ‘0’ (например, & -> -10), и это дает вам числа больше 10 (например, x -> 26)
SheetJS 28 дек. 2014, в 18:14
int ia = a — ‘0’ — это то, что вам нужно
funk 05 май 2015, в 21:27
Kevin Zakka 03 окт. 2015, в 10:42
@ kevin001 Если вы хотите преобразовать char в int, а символ ‘1’ предоставляет число ascii, отличное от 1 , вам нужно удалить смещение ‘0’ чтобы выровнять его, чтобы считать от 0 до 9. Последовательные числа 1-9 соседствуют в целом числе ascii.
krisdestruction 09 окт. 2015, в 17:36
Нет литья требуется / желательно
Craig Estey 11 окт. 2015, в 22:14
этот трюк «0» удивителен. очень помог мне
rain_ 14 июль 2016, в 13:16
Можете ли вы описать принцип этой магии?
JustLogin 26 янв. 2019, в 20:52
Показать ещё 6 комментариев
C и С++ всегда поддерживают типы по меньшей мере int . Кроме того, символьные литералы имеют тип int в C и char в С++.
Вы можете преобразовать тип char , просто назначив int .
char c = 'a'; // narrowing on C int a = c;
Matt Joiner 17 фев. 2011, в 14:15
Поделиться
Вы также можете использовать крайне недооцененный унарный operator+() для этой цели.
Cubbi 17 фев. 2011, в 14:14
-1 Ответ неверен только для осмысленного толкования вопроса. Это (code int a = c; ) сохранит любые отрицательные значения, с которыми стандартные функции библиотеки C не могут иметь дело. Стандартные библиотечные функции C устанавливают стандарт того, что значит обрабатывать значения char как int .
Cheers and hth. — Alf 17 фев. 2011, в 14:14
@ Наваз — . при условии, что он хочет простой тип, а не фактическое преобразование.
T.E.D. 17 фев. 2011, в 14:21
@ Альф П. Штайнбах: Я не согласен, это выходит за рамки вопроса и предполагает слишком много. Также обратите внимание, что добавление символьных буквальных интерпретаций направлено на ответ @Sayam Ahmed. Этот ответ сводится к int a = c; как достаточно.
Matt Joiner 17 фев. 2011, в 14:26
@TED . хм .. может быть .. этот вопрос сейчас кажется недостаточно ясным ..
Nawaz 17 фев. 2011, в 14:27
@Matt: я держу вниз голосов. Я бы усилил это, если это возможно! Интерпретация вопроса, которую вы и другие предположили, не имеет смысла, потому что она слишком тривиальна, и потому что для конкретной комбинации типов OP есть не очень тривиальная очень важная практическая проблема. Совет, который вы даете, непосредственно опасен для новичка. Скорее всего, это приведет к неопределенному поведению для их программ, которые используют функции классификации символов стандартной библиотеки C. Реф. на ответ @ Sayam, он удалил этот ответ.
Cheers and hth. — Alf 17 фев. 2011, в 15:22
-1 за неправильность: isupper () будет иметь неопределенные результаты, если передан 1252 старшего символа.
Chris Becke 17 фев. 2011, в 15:34
Что вы подразумеваете под «всегда продвигать»? Значения повышаются во время неявных преобразований, передачи определенных типов параметров (например, в функцию varargs) и когда оператор должен сделать свои операнды совместимыми типами. Но, безусловно, бывают случаи, когда значение не продвигается (например, если я передаю символ функции, ожидающей символ), иначе у нас не было бы типов, меньших, чем int.
Adrian McCarthy 18 май 2013, в 19:44
Не работал для меня. Я должен был сделать: например, «5» — «0» = 5
Koray Tugay 24 нояб. 2013, в 07:47
Мы должны сделать num-‘0 ‘, чтобы это работало.
Shivendra 30 май 2017, в 19:50
Показать ещё 8 комментариев
Ну, в ascii коды начинаются от 48. Все, что вам нужно сделать, это:
int x = (int)character - 48;
Vlad Isoc 09 июнь 2015, в 09:55
Поделиться
Или более читабельно: ‘ int x = character — ‘0’
chad 27 июль 2016, в 22:37
@chad: не только более читабельный, но и более портативный. C и C ++ не гарантируют представление ASCII, но они гарантируют, что независимо от того, какое представление используется, представления десяти десятичных цифр являются смежными и в числовом порядке.
Ben Voigt 17 апр. 2017, в 00:16
char — всего 1 байтовое целое число. В char нет ничего волшебного! Так же, как вы можете назначить короткий для int или int long, вы можете назначить char для int.
Да, имя примитивного типа данных оказывается «char», что указывает на то, что оно должно содержать только символы. Но на самом деле «char» — это просто плохой выбор имени, чтобы смутить всех, кто пытается выучить язык. Лучшее имя для него — int8_t, и вы можете использовать это имя вместо этого, если ваш компилятор следует последнему стандарту C.
Хотя при обработке строк вы должны использовать тип char, потому что индекс классической таблицы ASCII соответствует 1 байту. Тем не менее, вы могли бы обрабатывать строки с помощью обычных ints, хотя в реальном мире нет практической причины, почему вы когда-либо захотите это сделать. Например, следующий код будет работать отлично:
int str[] = ; for(i=0; i
Вы должны понимать, что символы и строки — это просто цифры, как и все остальное на компьютере. Когда вы пишете ‘a’ в исходном коде, он предварительно обрабатывается в число 97, которое является целочисленной константой.
Итак, если вы пишете выражение типа
char ch = '5'; ch = ch - '0';
это фактически эквивалентно
char ch = (int)53; ch = ch - (int)48;
который затем проходит целые рекламные акции на языке C
ch = (int)ch - (int)48;
а затем усечен до char, чтобы соответствовать типу результата
ch = (char)( (int)ch - (int)48 );
Там много таких тонких вещей, которые происходят между строками, где char неявно рассматривается как int.
Lundin 17 фев. 2011, в 15:19
Поделиться
Поскольку вопрос не помечен ascii , вы не должны предполагать какую-либо конкретную кодировку. Установка char равной int8_t , неверна, поскольку она также может быть uint8_t или uint24_t .
Roland Illig 31 март 2018, в 20:18
@RolandIllig Нет, char всегда равен 1 байту, и если в int8_t uint8_t существуют типы int8_t / uint8_t (что весьма вероятно), они смогут соответствовать результату char , потому что тогда он будет 8 бит. В очень экзотических системах, таких как различные устаревшие DSP, char будет 16 бит, а uint8_t не будет. Написание кода для совместимости с устаревшими DSP не имеет смысла, так же как написание для совместимости с системами дополнения или знака и величины. Огромная трата времени, поскольку такие системы практически не существуют в реальном мире.
Lundin 01 апр. 2018, в 20:11
(Этот ответ относится к С++ стороне вещей, но проблема расширения знака существует и в C.)
Обработка всех трех типов char (подписанный, неподписанный и «char» ) более деликатный, чем первый. Значения в диапазоне от 0 до SCHAR_MAX (что составляет 127 для 8-бит char):
char c = somevalue; signed char sc = c; unsigned char uc = c; int n = c;
Но когда какое-то значение выходит за пределы этого диапазона, только просмотр без знака char дает согласованные результаты для «тех же» char значений во всех трех типах:
char c = somevalue; signed char sc = c; unsigned char uc = c; // Might not be true: int(c) == int(sc) and int(c) == int(uc). int nc = (unsigned char)c; int nsc = (unsigned char)sc; int nuc = (unsigned char)uc; // Always true: nc == nsc and nc == nuc.
Это важно при использовании функций из , таких как isupper или toupper, из-за расширения знака:
char c = negative_char; // Assuming CHAR_MIN < 0. int n = c; bool b = isupper(n); // Undefined behavior.
Обратите внимание, что преобразование через int неявно; это имеет тот же UB:
char c = negative_char; bool b = isupper(c);
Чтобы исправить это, перейдите в unsigned char, что легко сделать с помощью функций wrapping через safe_ctype:
template int safe_ctype(unsigned char c) < return F(c); >//. char c = CHAR_MIN; bool b = safe_ctype(c); // No UB. std::string s = "value that may contain negative chars; e.g. user input"; std::transform(s.begin(), s.end(), s.begin(), &safe_ctype); // Must wrap toupper to eliminate UB in this case, you can't cast // to unsigned char because the function is called inside transform.
Это работает, потому что любая функция, берущая любой из трех типов char, может также принимать два других типа char. Это приводит к двум функциям, которые могут обрабатывать любой из типов:
int ord(char c) < return (unsigned char)c; >char chr(int n) < assert(0 // Ord and chr are named to match similar functions in other languages // and libraries.
Ord (c) всегда дает вам неотрицательное значение - даже если он прошел отрицательный char или отрицательный знак char - и chr принимает любое значение ord производит и возвращает тот же самый char.
На практике я, скорее всего, просто использовал бы беззнаковые char вместо их использования, но они вкратце завершают листинг, обеспечивают удобное место для добавления проверки ошибок для int-to-w9812 > и будут короче и более ясно, когда вам нужно использовать их несколько раз в непосредственной близости.
Developing.ru
На Win32 тип int имеет размер 4 байта, а char - 1 байт. Таким образом "честное" преобразование int в char невозможно. Возможно лишь преобразование с усечением (truncation). Самое распространенное усечение - это отбрасование старших байт. Как это сделать продемонстировал IceFlame.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
dmitry1208197320 Сообщения: 16 Зарегистрирован: 13 янв 2010, 17:48
Спасибо за ответ!
eqltv Сообщения: 6 Зарегистрирован: 05 фев 2010, 14:22
IceFlame писал(а): Ну, например,
int a; char b; b = (char) a;
Это язык си, а вопрос был про C++. В плюсах лучше писать так:
b = char(a);
или еще лучше (понятнее)
b = static_cast(a);
dmitry1208197320 Сообщения: 16 Зарегистрирован: 13 янв 2010, 17:48
спасибо, учту
BulldozerBSG Сообщения: 263 Зарегистрирован: 09 янв 2010, 04:14 Контактная информация:
eqltv писал(а): Это язык си, а вопрос был про C++. В плюсах лучше писать так:
b = char(a);
или еще лучше (понятнее)
b = static_cast(a);
А не одна ли малина, или компилятор код разный генерирует?
Romeo Сообщения: 3091 Зарегистрирован: 02 мар 2004, 17:25 Откуда: Крым, Севастополь Контактная информация:
BulldozerBSG, ну если начинать говорить о С++ преобразованиях типов, то это целая отдельная и очень интересная тема со своей собственной философией. Можем обсудить все тонкости, если хочешь. или если кто-нибудь из посетителей хочет
Будет ли сгенерирован другой код? Для static_cast не будет. Однако static_cast более безопасен, так как помимо преобразования как такового, на этапе компиляции он дополнительно осуществляет валидацию правильности преобразования. Любой тип скастить в либой тип с помощью static_cast нельзя: в случае несоответствия будет выдана ошибка компиляции.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
GeorgeSoca Сообщения: 0 Зарегистрирован: 12 окт 2015, 04:09 Откуда: Guam Контактная информация:
На нашем сайте вы можете чувствовать себя в безопасности! Кроме того, мы используем зеркальные жесткие диски на все наши серверы, поэтому мы также взять резервную два раза в день на отдельных серверах. Мы используем ISPmanager, как на панели управления. ISPmanager является панель управления, которая позволяет легко управлять своей веб-сайт. С нами вы можете разместить столько веб-сайты и домены, которые вы хотите для учетной записи хостинга.
virtual hosting
9 сообщений • Страница 1 из 1
- Системное и прикладное программирование
- ↳ Win API, Shell..
- ↳ C и C++
- ↳ Delphi и Pascal
- ↳ Программирование на Pascal и Delphi (Object Pascal)
- ↳ Все вопросы ООП
- ↳ Компоненты в Delphi
- ↳ Delphi и WinAPI, ActiveX и OLE , COM и DCOM, и т.д
- ↳ Java
- ↳ MS Office и VB(A).
- ↳ Ассемблер
- WEB программирование
- ↳ JScript, VBScript, DHTML.
- ↳ Perl, PHP, ASP .
- Некатегоризированное
- ↳ Вопрошайка
- ↳ SQL
- ↳ Алгоритмы
- ↳ Дизайн и графика
- Администрирование
- ↳ Apache, IIS.
- ↳ Операционные системы
- Работа
- ↳ Вакансии и заказы для программистов
- ↳ Поиск работы и заказов.
- ↳ Решите мне задачку
- ↳ задачи на Паскале и Delphi
- ↳ задачи на C и C++
- ↳ задачи на Basic и Visual Basic (VB)
- Прочее
- ↳ Жалобная книга
- ↳ Флейм.
Преобразовать int в char в C#
В этом посте будет обсуждаться, как преобразовать int в char в C#.
1. Явное преобразование (приведения)
C# не поддерживает неявное преобразование типа "int" в "char", поскольку это преобразование небезопасно для типов и может привести к потенциальной потере данных. Однако мы можем сделать явное преобразование с помощью оператора приведения () . Приведение информирует компилятор о том, что преобразование является преднамеренным.
Следующая программа преобразует значение целого числа в значение типа Char.
Перевод из int в char c#
Как перевести значение из int в char? Convert.ToChar и b=(char) d преобразуют значение только в юникод, нужно конкретно такое же значение.
Голосование за лучший ответ
Convert.ToChar(b.ToString());
Похожие вопросы
Ваш браузер устарел
Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.