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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
#1

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

04.06.2011, 16:53. Просмотров 2018. Ответов 8
Метки нет (Все метки)

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

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

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

Перевод чисел Bin - Oct - Dec - Hex - C++
Существуют ли функции для перевода числа (или строки из цифр) из одной системы счисления (по основанию 2, 8, 10, 16) в другую. Как из...

Манипуляторы dec hex setfill setw - C++
что такое операторы dec hex setfill sew м как они работают?

[BMP] HEX (из HEX-редактора) в DEC - C++
Имеется файл *.bmp (который нельзя вложить в сообщение). В самом файле есть его свойства (размер и т.д.). Как их перевести из HEX в DEC? ...

Из Hex в Dec - C++
Перевел из чара в инт и что-то не вьеду как теперь возвести . #include<iostream> #include<cmath> #include<string> using...

S dec na hex, ukazatel - C++
Pomogite pojaluista! Etot kod menyaet 10noe chislo na 16noe. Nado izmenit eto chtoby zdes byl ukazatel i funkcia to est v int main() Tolko...

Перевод числа из hex в dec - C++
Привет, можете подсказать как можно перевести 16-ричное число произвольной длины (например, заданное с помощью строки) в десятичную сс?...

8
Evg
Эксперт CАвтор FAQ
17931 / 6155 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
04.06.2011, 17:37 #2
Вот здесь Неочевидные ответы на простые вопросы почитай раздел 8, может ясности в вопросе прибавится
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
04.06.2011, 18:18  [ТС] #3
Со вторым вопросом понятно, но не с первым.

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

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

Цитата Сообщение от Chelioss Посмотреть сообщение
Ввожу символ t, код которого 116. В результате должно записаться число 278
Ничего не понял. Приведи конкретный код программы с конкретными описаниями типов, а не так, что сначала написал некий код, потом что-то на словах сказал и что-то в уме подразумевал
1
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
04.06.2011, 18:32 #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.
понятно?
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
04.06.2011, 18:47  [ТС] #6
Цитата Сообщение от Evg Посмотреть сообщение
Ничего не понял.
C++
1
2
unsigned char str[LEN];
cin >> hex >> str; // t
Цитата Сообщение от pito211 Посмотреть сообщение
понятно?
С английским не дружу. numerical values - численные значения(google переводчик). А ведь char:
char - это обычный целочисленный тип: такой же по природе, как int, но другого размера.
0
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
04.06.2011, 18:59 #7
http://ru.wikipedia.org/wiki/Символьный_тип
0
Evg
Эксперт CАвтор FAQ
17931 / 6155 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
04.06.2011, 19:03 #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 минуту
Цитата Сообщение от pito211 Посмотреть сообщение
http://ru.wikipedia.org/wiki/Символьный_тип
Очередная идиотская статья, написанная "для галочки" ("чтобы было"), из которой начинающий ничерта не сможет понять
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
05.06.2011, 09:50 #9
Цитата Сообщение от Chelioss Посмотреть сообщение
unsigned char str[LEN];
Это не символ, а строка символов. На строки числовые манипуляторы не распространяются.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2011, 09:50
Привет! Вот еще темы с ответами:

Как в С++ конвертнуть HEX в DEC? - C++
Киберперцы, есть ли готовая функция в Visual C++ для конвертации из HEX (типа F4A36) в DEC (типа 1002038) ?

Hex коды символов из char* в стринг - C++
Добрый день. Голову себе сломал, гуглил. Все без толку. Есть массив символов (char*). Мне нужно получить строку std::string отображающую...

Если HEX одного файла заменить на HEX другого, то изменится ли файл и будет ли работоспособным? - C++
Привет, если два файла a.exe(калькулятор) и b.exe(выводит строку &quot;Hello World&quot;) Если открыть файл b.exe в HEX-редакторе и подменить его...

Матрица и одномерный массив (Составить одномерный массив, содержащий количество буквенных символов в каждом из ее столбцов, подсчет символов) - C++
Помогите решить задачку: Дана матрица 5х7, элементами которой являются значения символьного типа. Составить одномерный массив, содержащий...


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
05.06.2011, 09:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru