Мне нужно объединить два подписанных 8-битных значения _int8 в подписанное короткое (16-битное) значение. Важно, чтобы знак не потерялся.
Мой код:
unsigned short lsb = -13;
unsigned short msb = 1;
short combined = (msb << 8 )| lsb;
В результате я получаю -13
. Однако я ожидаю, что это будет 499
.
Для следующих примеров я получаю правильные результаты с тем же кодом:
msb = -1; lsb = -6; combined = -6;
msb = 1; lsb = 89; combined = 345;
msb = -1; lsb = 13; combined = -243;
Однако msb = 1; lsb = -84; в сочетании = -84;
где я ожидал 428
.
Кажется, что если lsb отрицательное, а msb положительное, что-то пойдет не так! Что не так с моим кодом? Как компьютер достигает этих неожиданных результатов (Win7, 64-разрядная версия и VS2008 C ++)?