Форум программистов, компьютерный форум CyberForum.ru

Влияет ли манипуляторы hex,oct,dec на массив символов? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
04.06.2011, 16:53     Влияет ли манипуляторы hex,oct,dec на массив символов? #1
Влияет ли манипуляторы hex,oct,dec на массив символов?

есть unsigned char str[LEN];
Ввожу и так cin >> hex >> str;
и так cin >> str;
Результат один и тот же, хотя если бы вместо str была бы переменная типа int, то при вводе числа 45 получилось бы в итоге 69.

И еще, коды в переменных типа char и числа в int всегда записываются в десятичной системе исчисления, т.е. что бы не вводил в итоге будет число в десятичной системе исчисления?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2011, 16:53     Влияет ли манипуляторы hex,oct,dec на массив символов?
Посмотрите здесь:

C++ манипуляторы
C++ Как в С++ конвертнуть HEX в DEC?
[BMP] HEX (из HEX-редактора) в DEC C++
Перевод чисел Bin - Oct - Dec - Hex C++
Манипуляторы. От С к С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
04.06.2011, 17:37     Влияет ли манипуляторы hex,oct,dec на массив символов? #2
Вот здесь Неочевидные ответы на простые вопросы почитай раздел 8, может ясности в вопросе прибавится
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
04.06.2011, 18:18  [ТС]     Влияет ли манипуляторы hex,oct,dec на массив символов? #3
Со вторым вопросом понятно, но не с первым.

C++
1
2
int a;
cin >> hex >> a;
Допустим, ввожу число 45. Вводится в шестнадцатеричной форме записи числа, потом преобразуется в десятеричную 45>69 и записывается в переменную a;

Итак,
char - это обычный целочисленный тип: такой же по природе, как int, но другого размера.
Ввожу символ t, код которого 116. В результате должно записаться число 278, но записывается число 116. Если char - это тот же int(размер я так понимаю не важен), тогда почему 116 не преобразовалось в 278?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
04.06.2011, 18:30     Влияет ли манипуляторы hex,oct,dec на массив символов? #4
Дело в том, что работа cin'а по сути дела зависит от того, как перегружены операторы для разных типов. Если у тебя есть int'овая переменная "a", то "cin >> a" отрабатывает таким образом, что сначала где-то запоминается введённая строка (просто как набор символов), а затем запускается процедура конвертации из строки в число, настроенная таким образом, что строковая запись трактуется как 10-ичная запись числа. А "cin >> hex >> a" отработает точно так же, только конверnилка настроена на 16-ричную запись

Цитата Сообщение от Chelioss Посмотреть сообщение
Ввожу символ t, код которого 116. В результате должно записаться число 278
Ничего не понял. Приведи конкретный код программы с конкретными описаниями типов, а не так, что сначала написал некий код, потом что-то на словах сказал и что-то в уме подразумевал
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
04.06.2011, 18:32     Влияет ли манипуляторы hex,oct,dec на массив символов? #5
ios_base& hex ( ios_base& str );

Use hexadecimal base
Sets the basefield format flag for the str stream to hex.

When basefield is set to hex, integral numerical values inserted into the stream are expressed in the hexadecimal base (radix 16). For input streams, extracted values are also expected to be expressed in the hexadecimal base when this flag is set.
понятно?
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
04.06.2011, 18:47  [ТС]     Влияет ли манипуляторы hex,oct,dec на массив символов? #6
Цитата Сообщение от Evg Посмотреть сообщение
Ничего не понял.
C++
1
2
unsigned char str[LEN];
cin >> hex >> str; // t
Цитата Сообщение от pito211 Посмотреть сообщение
понятно?
С английским не дружу. numerical values - численные значения(google переводчик). А ведь char:
char - это обычный целочисленный тип: такой же по природе, как int, но другого размера.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
04.06.2011, 18:59     Влияет ли манипуляторы hex,oct,dec на массив символов? #7
http://ru.wikipedia.org/wiki/Символьный_тип
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
04.06.2011, 19:03     Влияет ли манипуляторы hex,oct,dec на массив символов? #8
С точки зрения компилятора и хранения данных char - это действительно такой же int, но более короткий. Но при этом массив char'ов как правило трактуется как строка. При этом надо понимать, что строка - это всего лишь массив целых чисел, но числа при этом кодируют не свои значения, а некоторые символы. Это становится критичным только в случае ввода-вывода. Т.е. при печати char'а может возникнуть двоякая ситуация: распечатать его как число или распечатать как символ (который закодирован в виде числа).

В Си'шном printf'е с этим вопросом всё более-менее ясно. При печати любого переданного значения мы явно указываем, каким образом трактовать это значение (%d - как целое число, %c - как символ):

C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main (void)
{
  char c;
 
  c = 70;
  printf ("%d\n", c);
  printf ("%c\n", c);
  return 0;
}
будет напечатано

Код
70
F
Потому что значение 70, рассмотренное (трактованное) как кодировка символа, является буквой F. Это НЕ свойство языка программирования и НЕ свойство процессора. Это некое человеческое соглашение

В Си++ с этим делом несколько иначе сделано. У тебя есть перегруженный оператор << который привязан к типу, но при этом нет возможности указать, а каким же образом трактовать переданное значение. Разработчики сделали так, что для char'а оператор << будет печатать его как символ (т.е. трактовать char как кодировку). При вводе всё тоже самое, только у тебя символьное представление превращается в числовое. Если char в данном случае трактовать как целое число, то введённое значение "0" должно превратиться в однобайтовое число со значением 0. Если же трактовать как символ, то "0" должен превратиться в однобайтовое число, кодирующее символ "0" - это число 48. Оператор >> и cin работают симметрично cout'у и оператору << и трактуют char как символ (т.е. cin >> в отношении char'а работает не так, как в отношении прочих целых типов)

Ну и дополнительно массив char'ов трактуется cin'ом и cout'ом как строка символов. Как в таком случае должен работать hex - хз, ибо hex следует применять при работе с числами, а не символами

Добавлено через 1 минуту
Очередная идиотская статья, написанная "для галочки" ("чтобы было"), из которой начинающий ничерта не сможет понять
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2011, 09:50     Влияет ли манипуляторы hex,oct,dec на массив символов?
Еще ссылки по теме:

Std::count << std::hex << (long) 0x0a; Как сделать, чтоб от HEX значения ноль при выводе не убирался? C++
C++ Hex коды символов из char* в стринг
Если HEX одного файла заменить на HEX другого, то изменится ли файл и будет ли работоспособным? C++

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
05.06.2011, 09:50     Влияет ли манипуляторы hex,oct,dec на массив символов? #9
Цитата Сообщение от Chelioss Посмотреть сообщение
unsigned char str[LEN];
Это не символ, а строка символов. На строки числовые манипуляторы не распространяются.
Yandex
Объявления
05.06.2011, 09:50     Влияет ли манипуляторы hex,oct,dec на массив символов?
Ответ Создать тему
Опции темы

Текущее время: 19:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru