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

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

19.02.2020, 21:59. Показов 6047. Ответов 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,923
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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,923
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
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
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
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,923
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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru