Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Два char в один short


Автор: mrbrooks 9.11.2007, 15:23
Народ! Помогите! Туплю. Как два char переобразовать в short. 

Приходит ко мне 
первый char a = 7;
второй char b = 154;

я делаю так:

short c = (a<<8) + b; 

Я прав или накосячил?

Автор: EnergoHokum 9.11.2007, 15:30
Что именно ты с ними хочешь сделать? 
Код

memcpy(&a+sizeof(char),&b,sizeof(char));//Это?


Автор: Fazil6 9.11.2007, 15:33
Цитата(mrbrooks @  9.11.2007,  15:23 Найти цитируемый пост)
Я прав или накосячил?

ну если не считать, что судя по всему все должно быть unsigned

Автор: MAKCim 9.11.2007, 15:36
Цитата(mrbrooks @  9.11.2007,  15:23 Найти цитируемый пост)
Я прав или накосячил?

лучше так
Код

((unsigned short)a << 8) | b;

Автор: mrbrooks 9.11.2007, 15:36
EnergoHokum
Не - я получаю два char как один short. И мне нужно обратно теперь эти char в один short преобразовать.

Автор: Sartorius 9.11.2007, 15:40
советую сразу делать анонимное объединение
Код

union {
 struct {
  char a, b;
 };
  short c;
};


 Содержимое чаров зависит от того биг или литл эндиан архитектура у вас.

Автор: Lazin 9.11.2007, 15:41
Код

short s = ???;
char hi = 0, lo = 0;

lo = s;
hi = s >> 8;


Автор: mrbrooks 9.11.2007, 15:48
Цитата(Lazin @ 9.11.2007,  15:41)
Код

short s = ???;
char hi = 0, lo = 0;

lo = s;
hi = s >> 8;

дык мне же short и не известен. потому и спрашиваю   smile 

Автор: EnergoHokum 9.11.2007, 15:48
Т. е. у тебя short разбивается как-то на два char-а, и тебе их нужно обратно в short склеить?

Автор: mrbrooks 9.11.2007, 15:53
Цитата(EnergoHokum @ 9.11.2007,  15:48)
Т. е. у тебя short разбивается как-то на два char-а, и тебе их нужно обратно в short склеить?

Точно комрад. Извините если не очень четко поставил вопрос. Просто запарился.

Автор: EnergoHokum 9.11.2007, 15:59
В том коде, что я написал, ошибка была, нужно так:
Код

char a; char b; short c;
c=(short)b;//предполагаем, что b - "нижняя" половинка
memcpy(&c+sizeof(char),&a,sizeof(char));

ВотЪ. А можно и так:
Код

char a; char b; short c;
c=(short)b; c+=(short)(a<<8);//за правильность не уверен, первый вариант кажется надёжней

Автор: Lazin 9.11.2007, 16:39
из char в short - вот-так
Код

short s = ((unsigned short)a << 8) | b;

обратно - так
Код

char a = 0,  b = 0;
b = s;
a = s >> 8;

Цитата(EnergoHokum @  9.11.2007,  15:59 Найти цитируемый пост)
memcpy(&c+sizeof(char),&a,sizeof(char));

создатели стандартной библиотеки вряд-ли догадывались что memcpy для этого использовать будут 

Автор: mrbrooks 9.11.2007, 16:40
EnergoHokum Что не то все равно получается. Но куда копать - ясно.  спасибо. но вопрос пока не решен...  smile  

Автор: mrbrooks 9.11.2007, 17:03
Все получилось вот с таким результатом. Всем спасибо.

Код


((unsigned short)((a << 8) +b);


Автор: Alek86 10.11.2007, 11:38
странно. мне казалось, в интел архитектуре, в слове байты хранятся сначала второй, а потом первый

Автор: Lazin 10.11.2007, 12:03
Цитата(Alek86 @  10.11.2007,  11:38 Найти цитируемый пост)
странно. мне казалось, в интел архитектуре, в слове байты хранятся сначала второй, а потом первый 

В общем это неважно, если ты читаешь их в так-же что и записываешь.

Автор: Alek86 10.11.2007, 12:31
если будет

Код

unsigned short i = ((unsigned short)((a << 8) +b);


то дальше, естесственно, будет использоваться не точно так-же, а как обычное слово

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)