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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
sergey.shuvalov
-6 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 268
#1

записать по-битого один short int в два char - C++

30.06.2013, 12:12. Просмотров 2287. Ответов 12
Метки нет (Все метки)

Здрасьте, всем.
Записать побитого два char в один short int это:
C++
1
2
3
4
char char1;
char char2;
short int s;
s=char1<<8|char2;
А как записать побитого один short int в два char ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2013, 12:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос записать по-битого один short int в два char (C++):

Преобразование 2-х char в один short int - C++
Пробую преобразовать 2 char в один short int таким образом: char buf; short int skl; int kol=0; for(int...

Как записать Short в два char'a? - C++
Есть переменная типа short необходимо записать ее в чаровский массив... как то там через указатели как я хз((((

Char, short, int, long: какой тип выбрать? - C++
Всем привет Читая книги по C++ столкнулся с тем, что везде пишут примерно одно и тоже. Допустим про char, short, int, long пишут что...

Двоичный дамп short и char выводится как int - C++
Доброго дня! Пытаюсь выводить двоичный дамп переменных char, short и int вот таким образом: #include &lt;iostream&gt; using namespace...

дан массив char[22] как превратить отдельные байты в int, short - C++
Дан массив char. В нем содержатся на заранее определенных местах разные типы целых(int и short). Как их грамотно выделить в отдельные...

Размер для данных (int, char, long, double, short, unsigned, float) - C++
Напишите программу, которая будет определять размер для данных (int, char, long, double, short, unsigned, float) и выводить информацию (о...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
drdrink
39 / 39 / 1
Регистрация: 13.05.2013
Сообщений: 103
30.06.2013, 17:48 #2
sergey.shuvalov, а разве так правильно будет когда мы в один short int пытаемся записать 2 char, по-моему когда ты сдвигаешь char1 на 8, то поскольку размер char 8 бит, то мы тупо затрём char1 то есть там будет 0, а потом дизъюнкцией запишем в него char2 и всё это присвоим s, наверно так надо сделать:

C++
1
2
3
char char1, char2;
short int s = char1;
s = (s << 8) | char2;
Добавлено через 2 минуты
sergey.shuvalov, а чтобы записать в 2 char
C++
1
2
3
4
char char1, char2;
short int s;
char1 = s >> 8;
char2 = (s << 8) >> 8;
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
30.06.2013, 19:14 #3
для таких случаев существуют union ы
C++
1
2
3
4
5
6
7
union{
  char bytes[2];
  short int data;
}word16;
word16.data=s;
char1=word16.bytes[0];
char2=word16.bytes[1];
sergey.shuvalov
-6 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 268
30.06.2013, 21:54  [ТС] #4
У меня получилось короче.

C++
1
2
3
4
char char1, char2;
short int s;
char1 = s ;
char2 = s >> 8;
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
01.07.2013, 09:50 #5
C++
1
2
3
4
5
6
7
8
char char1, char2;
short int s;
 
char1=*((char*)&s);
char2=*(((char*)&s)+1);
 
*((char*)&s)=char1;
*(((char*)&s)+1)=char2;
мне нравиться с указателями всякие такие штуки проделывать

Добавлено через 2 минуты
или еще лучше
C++
1
2
3
4
5
6
7
8
char char1, char2;
short int s;
 
char1=((char*)&s)[0];
char2=((char*)&s)[1];
 
((char*)&s)[0]=char1;
((char*)&s)[1]=char2;
Evg
Эксперт CАвтор FAQ
17623 / 5847 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
01.07.2013, 10:31 #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
для таких случаев существуют union ы
C++
1
2
3
4
5
6
7
union{
  char bytes[2];
  short int data;
}word16;
word16.data=s;
char1=word16.bytes[0];
char2=word16.bytes[1];
Цитата Сообщение от Praktolock Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
char char1, char2;
short int s;
 
char1=*((char*)&s);
char2=*(((char*)&s)+1);
 
*((char*)&s)=char1;
*(((char*)&s)+1)=char2;
мне нравиться с указателями всякие такие штуки проделывать
Эти два кода являются НЕпереносимыми. Они дадут разные результаты на машинах little-endian и big-endian. Бестолковые преподаватели об этом навряд ли задумаются, но для самообразования это знать полезно
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
01.07.2013, 10:48 #7
Цитата Сообщение от Evg Посмотреть сообщение
Эти два кода являются НЕпереносимыми
Ну сделай макрос из этого, если хочешь перенести, только копирайты укажи xD

Добавлено через 6 минут
какая может понадобитсься переносимость при такой постановке задачи, как я понял совершенно неважно какой из двух байтов окажется страшим
а как с переносимостью такого варианта:
C++
1
2
3
4
5
6
7
char char1, char2;
unsigned short s;
 
char1=s/256;
char2=(s-((unsigned short)char1)*256);
 
s=((unsigned short)char1)*256+char2;
Evg
Эксперт CАвтор FAQ
17623 / 5847 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
01.07.2013, 15:22 #8
Praktolock, мои посты можешь не читать, тебе это ни к чему. А вот кому-то они могут оказаться полезными
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
01.07.2013, 15:27 #9
Я просто сказал что думаю, извини если про макрос тебе показалось подколкой, слишком тонкая шутка. А вот по поводу последнего варианта мне действительно интересно мнение эксперта - что насчёт переносимости такого варианта
Evg
Эксперт CАвтор FAQ
17623 / 5847 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
01.07.2013, 17:08 #10
Цитата Сообщение от Praktolock Посмотреть сообщение
Я просто сказал что думаю, извини если про макрос тебе показалось подколкой, слишком тонкая шутка. А вот по поводу последнего варианта мне действительно интересно мнение эксперта - что насчёт переносимости такого варианта
Он по своей сути совпадает с вариантом из поста #2. Варианты из постов #2 и #7 работают исключительно над значениями, а потому являются переносимыми. Способ хранения значений в памяти (endian) учитывает компилятор. Варианты из постов #3 и #5 пытаются учесть способ хранения значений в памяти, но делают это не до конца, т.к. учитывают только little-endian расположение, а потому являются НЕпереносимыми

Варианты #3 и #5 можно допилить до переносимого варианта. Нужно под соответствующими макросам учесть правильный endian и написать два варианта кода. С учётом того, что нет какого-то стандартного способа в определении макросов, то в таких случаях приходится вручную учитывать каждую платформу, на которой предполагается запускать программу. Пример см. в http://www.cyberforum.ru/blogs/18334/blog100.html раздел 5.2
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
01.07.2013, 17:14 #11
но ведь там используются сдвиги, при этом как раз не учитывается в какую сторону надо сдвигать, т.е. с какой стороны находится младший а с какой старший байт, а вмоём последнем варианте только приведения типов, деления и умножения стандартных типов - вроде-бы максимально кросс-платформенно
Evg
Эксперт CАвтор FAQ
17623 / 5847 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
01.07.2013, 17:20 #12
Цитата Сообщение от Praktolock Посмотреть сообщение
но ведь там используются сдвиги, при этом как раз не учитывается в какую сторону надо сдвигать, т.е. с какой стороны находится младший а с какой старший байт, а вмоём последнем варианте только приведения типов, деления и умножения стандартных типов - вроде-бы максимально кросс-платформенно
Да. Но сдвигают ЗНАЧЕНИЕ. Значение числа не зависит от того, в каком endian'е оно хранится. От endian'а зависит только образ этого значения в памяти (т.е. в каком порядке в памяти будут лежать запчасти от значения). Другими словами, 100+200 будет равняться 300 независимо от того, какой endian у процессора. Но вот образ этих значений в памяти при побайтном дампе будет различаться для little-endian и big-endian

Добавлено через 29 секунд
Результат работы сдвигов от endian'а не зависит
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
01.07.2013, 17:20 #13
Цитата Сообщение от Evg Посмотреть сообщение
Результат работы сдвигов от endian'а не зависит
о, точно)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2013, 17:20
Привет! Вот еще темы с ответами:

Создать объединение, что содержит элементы типов char int short fload long string - C++
всем доброго времени суток! мне нужно создать объединение, что содержит элементы типов char int short fload long string. создать массив...

Напишите программу, которая будет определять размер для данных (int, char, long, double, short, unsigned, float) и выводить информацию - C++
1. Какие типы данных лучше всего использовать для хранения следующих значений: а) возраст человека в текущем году; б) вес человека в...

Как в выделенную память записать поочередно число int, массив char[n], и еще число int - C++
Выделяю память void* Start=malloc(Size); Как туда записать поочередно число int, массив char, и еще число int?

В чем разница между long int и short int - C++
Извините если вопрос нубский, но я ни как не могу понять смысл long int и short int. Например с unsingned все ясно. Один байт в int...


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

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

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