Перейти к содержимому

Фото
- - - - -

Как сложить 2 байта в одно слово?


  • Вы не можете создать новую тему
  • Please log in to reply
4 ответов в этой теме

#1 SmokEr

SmokEr
  • Пользователь
  • 119 сообщений

Отправлено 02 Август 2007 - 09:30

Ситуация такая, через COM порт получаю из девайса 16 разрядные данные со знаком. Получаю их по одному байту.
Например одно число получаю так:
255 и 208

То есть, казалось бы, ничего сложного, 255 записать в старший байт, 208 кинуть в младший байт того же слова, получаем -47....

но как это сделать??

Я сдвигатю первый байт на 8 позиций и к результату прибавлятю второй байт, получаю на выходе 65488, что в принципе верно, и даже юзабельно(через жопу правда) , но хотелось бы работать с числами в диапазоне от -32768 до 32767.

Сообщение изменено: SmokEr (02 Август 2007 - 09:31 )

  • 0

#2 SmokEr

SmokEr
  • Пользователь
  • 119 сообщений

Отправлено 02 Август 2007 - 10:21

Пока решил свою задачу математически:
int result;
byte a = 255;
byte b = 208;
	
int d = (a<<8) + b;
if (a > 127)
{	result = d - UInt16.MaxValue;  /*65535*/
}
else 
{result = d;
}
Но изначально было интересно, как заставить компилятор сразу интерпретировать результат как
слово со знаком? Пробовал делать Convert.ToInt16, выбрасывает исключение =(
  • 0

#3 V^v

V^v
  • Пользователь
  • 316 сообщений

Отправлено 02 Август 2007 - 13:13

в C# вроде есть short, тогда попробуй
short res = a << 8 | b;
  • 0
int main(void)

#4 SmokEr

SmokEr
  • Пользователь
  • 119 сообщений

Отправлено 02 Август 2007 - 15:38

Спасибо, посмотрел на слово 'short' и меня осенило, это называецца явным приведением типов, пишецца так:
res = (short)((a<<8) + B);
Блин, у меня ещё и с двоичной математикой проблемы
вышеприведённые байты складываюцца в -48 :rolleyes:

Сообщение изменено: SmokEr (02 Август 2007 - 15:40 )

  • 0

#5 ParadoxL

ParadoxL
  • Постоялец
  • 4 756 сообщений
  • Откуда:Edinburg

Отправлено 30 Август 2007 - 10:42

Больно сложно у тебя ... не красиво написано. Может так будет получше? :)
public static UInt16 GetWord(byte[] buffer, UInt32 offset)
{
  UInt16 val = (UInt16) (buffer[offset + 1] << 8);
  val += (UInt16) (buffer[offset + 0]);
  return val;
}

  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...