Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
12 / 0 / 0
Регистрация: 11.02.2020
Сообщений: 33

Тип переменной char

19.02.2020, 21:59. Показов 6637. Ответов 55
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Объясните мне, что то я не понимаю, как я понял, этот тип общий, можно как писать, так вводить цифры, но почему то начиная с 10 программа выключается, также можно писать всего одну букву, но при этом даже русскую. Объясните мне, что из себя представляет этот тип. Я не могу понять, это такой тип который служит для ввода одного любого символа?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2020, 21:59
Ответы с готовыми решениями:

Восьмибитный тип переменной (что за тип, но не BYTE и не CHAR?
Вроде давно занимаюсь программированием на С++, но встала проблема... Есть некий массив переменных имеющих 8 битный размер... без знака...

Определять тип вводимой переменной (char или int)
Вообщем изначально дали задание определять тип вводимой переменной (char или int ). Это я выполнил,затем изменили задание, нужно сделать...

Как присвоить к новой char переменной другую char переменную с указателем
Как присвоить к новой char переменной другую char переменную с указателем #include<iostream> int main() { using namespace...

55
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
20.02.2020, 20:56
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Какое выравнивание переменных размером в один байт? Или я как-то не так понимаю термин aliasing?
Видимо, вы путаете aliasing и alignment.

COKPOWEHEU, я не зря спросил о strict aliasing. И дело здесь не в выравнивании. Если своими словами, то считается, что изменение данных одного типа не может влиять на данные другого типа, т.е.
C++
1
2
3
4
5
6
7
extern "C" void foo(int * pi, long * pl)
{
    *pi = 22;//записали 22
   *pl = 45;//считается, что это изменение не может повлиять на значение *pi
   //компилятор вправе считать, что значение *pi не изменилось
   *pi *= 2;//значит можем просто записать сюда 44
}
clang 9.0.0 с опциями -std=c++2a -O3
Assembler
1
2
3
4
foo:                                    # @foo
        mov     qword ptr [rsi], 45
        mov     dword ptr [rdi], 44
        ret
Но для указателей на char сделано исключение, т.к. char предполагает работу с "голой" памятью:
C++
1
2
3
4
5
6
7
extern "C" void bar(int * pi, char * pc)
{
    *pi = 22;//записали 22
   *pc = 45;//считается, что это изменение может повлиять на значение *pi
   //компилятор не знает, изменилось ли значение *pi
   *pi *= 2;//так что придется тянуть его из памяти
}
Assembler
1
2
3
4
5
bar:                                    # @bar
        mov     dword ptr [rdi], 22
        mov     byte ptr [rsi], 45
        shl     dword ptr [rdi]
        ret
Так вот, иногда это мешает оптимизации для других типов данных. В том числе при работе со строками. Вы работаете со строкой, которая никак не может повлиять на другие данные, но компилятор все равно считает, что вы работаете с сырыми байтами (не знаю как корректнее обозвать). И char8_t как раз призван решить эту проблемку - для него нет такого правила как для char.

C++
1
2
3
4
5
6
extern "C" void zoo(int * pi, char8_t * pc)
{
    *pi = 22;
   *pc = 45;
   *pi *= 2;
}
Assembler
1
2
3
4
zoo:                                    # @zoo
        mov     byte ptr [rsi], 45
        mov     dword ptr [rdi], 44
        ret
Добавлено через 4 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Про "подписанные символы" не слышал такого термина.
Наверное, машинный перевод слова signed.
Перепишем так:
Для обеспечения типа без знака для данных UTF-8 (независимо от того, является ли char знаковым или беззнаковым, что определяется реализацией).
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
20.02.2020, 21:05
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Чем оно лучше текущей реализации utf-8 на обычных char'ах?
Consider the following string literal expressions, all of which encode U+0123, LATIN SMALL LETTER G WITH CEDILLA:
C++
1
2
3
4
5
u8"\u0123" // UTF-8:  const char[]:     0xC4 0xA3 0x00
 u"\u0123" // UTF-16: const char16_t[]: 0x0123 0x0000
 U"\u0123" // UTF-32: const char32_t[]: 0x00000123 0x00000000
  "\u0123" // ???:    const char[]:     ???
 L"\u0123" // ???:    const wchar_t[]:  ???
The UTF-8, UTF-16, and UTF-32 string literals have well-defined and portable sequences of code unit values. The ordinary and wide string literal code unit sequences depend on the implementation defined execution and execution wide encodings respectively. Code that is designed to work with text encodings must be able to differentiate these strings. This is straight forward for wide, UTF-16, and UTF-32 string literals since they each have a distinct code unit type suitable for differentiation via function overloading or template specialization. But for ordinary and UTF-8 string literals, differentiating between them requires additional information since they have the same code unit type. That additional information might be provided implicitly via differently named functions, or explicitly via additional function or template arguments.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Чем тут поможет перегрузка?
Странный вопрос, могу тебе работать с двумя типами "строк".
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Так проще char сделать беззнаковым по умолчанию. Кому надо сделают знаковым. Оно же и сейчас почти так.
Может поломать совместимость/чужой код.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Про "подписанные символы" не слышал такого термина.
Это должны были быть знаковые и беззнаковые, гугл переводчик, блин )
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Какое выравнивание переменных размером в один байт?
Там идется не о alignment, a aliasing.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
20.02.2020, 21:10
Цитата Сообщение от Croessmah Посмотреть сообщение
Наверное, машинный перевод слова signed
Цитата Сообщение от Azazel-San Посмотреть сообщение
гугл переводчик, блин
Угадал.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
20.02.2020, 21:15
COKPOWEHEU, тут стоит понимать, что новый char8_t это не тот же тип что и unsigned char. Так же char8_t, в отличие от unsigned char нельзя использовать как underlying storage для объектов другого типа, а также для проверки базового представления объектов других типов; другими словами, его нельзя использовать для псевдонимов (alias) других типов. Следствием этого является то, что к объектам типа char8_t можно получить доступ через указатели на char или unsigned char, но указатели на char8_t нельзя использовать для доступа к данным char или unsigned char. Другими словами:
C++
1
2
reinterpret_cast<const char   *>(u8"text"); // Ok.
reinterpret_cast<const char8_t*>("text");   // Undefined behavior.
Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Угадал.
Да )

0
20.02.2020, 21:16

Не по теме:

Цитата Сообщение от Azazel-San Посмотреть сообщение
Да )
Опыт. )

0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,088
20.02.2020, 23:14
Цитата Сообщение от elenayagubova Посмотреть сообщение
В этом примере я бы то же самое говорила при использовании спецификатора %c - нельзя получить с его помощью число, введенное с клавиатуры.
Вот это уже неудачный пример, поскольку %c - специальный формат для символа, а не числа.
Цитата Сообщение от Croessmah Посмотреть сообщение
Видимо, вы путаете aliasing и alignment.
действительно спутал.
Цитата Сообщение от Croessmah Посмотреть сообщение
Так вот, иногда это мешает оптимизации для других типов данных. В том числе при работе со строками. Вы работаете со строкой, которая никак не может повлиять на другие данные
Так вроде ж есть специальные модификаторы, кажется в memcpy используются иногда, тоже для оптимизации.
Цитата Сообщение от Azazel-San Посмотреть сообщение
Странный вопрос, могу тебе работать с двумя типами "строк".
Опять гуглопереводчик? При вводе любая строка преобразуется к внутреннему представлению (wchar_t скорее всего) и дальше работа идет только в нем. Та же utf-8 хорошо подходит для хранения, но не обработки. Ну а если национальных букв не предполагается, то и ADCII (char*) хватит.
Цитата Сообщение от Azazel-San Посмотреть сообщение
Может поломать совместимость/чужой код.
Если этот "чужой код" полагался на знаковость-беззнаковость char'а, то он изначально поломан, поскольку стандарт этого не гарантирует. То есть "более поломанным" он не станет. Да и -fsigned-char / -funsigned-char никто не отменял. Хотя с ужесточением стандарта хорошо бы выводить предупреждение. Впрочем, сама неопределенность знака в char непонятна: какой смысл может нести отрицательный код символа?!
Цитата Сообщение от Azazel-San Посмотреть сообщение
Там идется не о alignment, a aliasing.
Тем более. Aliasing же не привязан к типу данных. Можно и для int гарантировать "неперекрытие".
Цитата Сообщение от Azazel-San Посмотреть сообщение
его нельзя использовать для псевдонимов (alias) других типов
Хотят сделать более строгую типизацию что ли? И тем самым поломать оптимизации? А смысл?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
20.02.2020, 23:26
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Так вроде ж есть специальные модификаторы, кажется в memcpy используются иногда, тоже для оптимизации.
Вы о restrict? В C он есть, а в C++ нет. И не спрашивайте почему, мне тоже это интересно. )
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
20.02.2020, 23:32
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот это уже неудачный пример, поскольку %c - специальный формат для символа, а не числа.
Но примерно такую же ошибку делает человек, пытающийся с помощью ввода из потока ввести число в char. Результат, во всяком случае, одинаковый - в char записывается первый символ, остальные остаются в потоке.
Я, конечно, не очень удачно сформулировала свое сообщение про невозможность ввода числа в char(зато дискуссия ушла в интересное русло ), но отвечала исключительно на попытку HOBUchEK ввести "10" в качестве символа и предположение ReYalp о том, что в этом случае введется символ, соответствующий числу(коду) 10.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
20.02.2020, 23:32
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
При вводе любая строка преобразуется к внутреннему представлению (wchar_t скорее всего) и дальше работа идет только в нем.
Причем здесь вообще ввод? Вы читали, что я вам писал?
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если этот "чужой код" полагался на знаковость-беззнаковость char'а, то он изначально поломан, поскольку стандарт этого не гарантирует.
Зачем менять char? В чем смысл? Если можно получить более строгую типизацию.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Тем более. Aliasing же не привязан к типу данных. Можно и для int гарантировать "неперекрытие".
Тем, что char перекрывается со всеми типами.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Хотят сделать более строгую типизацию что ли? И тем самым поломать оптимизации? А смысл?
Какие оптимизации? О чем вы? Это наоборот улучшает оптимизацию.
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,088
21.02.2020, 10:00
Цитата Сообщение от Azazel-San Посмотреть сообщение
Причем здесь вообще ввод? Вы читали, что я вам писал?
Цитата Сообщение от Azazel-San Посмотреть сообщение
Странный вопрос, могу тебе работать с двумя типами "строк".
Я пытался перевести это на человеческий язык, но, похоже, не преуспел.
Цитата Сообщение от Azazel-San Посмотреть сообщение
Зачем менять char? В чем смысл? Если можно получить более строгую типизацию.
Именно для этого. Чтобы получить более строгую типизацию и не плодить сущности.
Цитата Сообщение от Azazel-San Посмотреть сообщение
Тем, что char перекрывается со всеми типами.
Любой другой 8-битный тип точно так же будет перекрываться. В чем разница?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
21.02.2020, 10:19
COKPOWEHEU, в том, что char8_t не перекрывается со всеми, как обычный char. Как и впрочем нету гарантии что он будет именно 8 бит занимать.

Ну и если хотим более строгую типизацию, без плождения сущностей не обойтись.
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
21.02.2020, 11:26
А компилятор с ума не сойдет от таких преобразований?
Проверил: действительно сойдет:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <iostream>
 
int main(int argc, char **argv){
  char a = 100;
  char b = 50;
  char c = 42;
  printf("%hhi %hhi %hhi\n", a, b, c);
  std::cin >> *(int*)&b;
  printf("%hhi %hhi %hhi\n", a, b, c);
}
Code
1
2
3
4
5
$ g++ main.c -Wall
$ ./a.out 
100 50 42
123
0 123 0
Самое забавное, что ваш код портит переменные по обе стороны от целевой. Я думал, только с одной будет. Но выравнивание - штука страшная.
Компилятору то что, он парень простой, сказали скомпилировать, они и сделал, а вот аллоктору, тому да, досталось.
0
12 / 12 / 5
Регистрация: 03.06.2016
Сообщений: 169
21.02.2020, 13:32
нужно знать только одно char это один байт, а писав cin>>ch; вы просто говорите прочесть с клавиатуры символ и написав например 1 и нажав на энтер вы говорите засунуть в эту переменную 0x31
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,088
22.02.2020, 14:45
Цитата Сообщение от Azazel-San Посмотреть сообщение
char8_t <...> нету гарантии что он будет именно 8 бит занимать.
Серьезно?! То есть они назвали тип по аналогии со стандартными типами фиксированного размера и не гарантируют размер?! Не говоря уж о том, что для символа UTF-8 стоило бы и тип назвать вроде utf8_t.
Не говоря уж о том, что символ UTF-8 штука переменной длины, от 8 до 32 бит, то есть в одну обычную переменную Си/С++ не влезет: либо там будет огрызок символа, бесполезный сам по себе, либо будет клон wchar_t. Хотя если сделать по принципу void (запретить разыменование и создание переменных не-указателей) может и имеет смысл... Хотя все равно пложение сущностей без необходимости.
Собственно, логичнее было бы делать не Си-подобную переменную, а сразу строковый объект со всеми необходимыми методами и преобразованиями в char*, wchar_t*, std::string, std::wstring.
В общем, непонятно зачем вводить еще один uint8_t с каким-то собственным назначением.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
22.02.2020, 14:54
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
стоило бы и тип назвать вроде utf8_t
Ну, да, вот с названием согласен.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
а сразу строковый объект со всеми необходимыми методами и преобразованиями
Будет и std::string под это.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
22.02.2020, 16:13
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В общем, непонятно зачем вводить еще один uint8_t с каким-то собственным назначением.
Пичалька.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2020, 16:13

Не могу преобразовать тип char в тип double
Вся загвоздка в str1 и str2; #include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include&quot;stdlib.h&quot; #include &quot;cstdlib&quot; #include...

Почему в setnamedisc нужно использовать char * для установки значения, а при возвращении значения тип метода должен быть char* ?
Вопрос такой, почему в методе setnamedisc нужно использовать char *s для установки значения, а при возвращении значения в методе...

Присвоить переменной char m значиние переменной int i..
Как присвоить переменной char m значиние переменной int i таким образом ? int main() { char m; int i = 5; m = i; # ( что бы...

тип char
Подскажите плз, почему сортировка не работает с типом char. С типом int, элементы сортируются. void InsertSort(v1 a) { for (char i...

Тип char и указатели
Вопрос... Тип может хранить только символы, или строки тоже? Если только символы, то почему этот код работает?: ... void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru