C ++ Как объединить два 8-битных числа со знаком в короткое 16-битное? Необъяснимые результаты

Мне нужно объединить два подписанных 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 ++)?

11
задан Jonas Stein 3 November 2019 в 23:24
поделиться