Для 8-битных байтов сначала просто преобразуйте в unsigned
:
typedef unsigned char Byte;
unsigned const u = (Byte( temp.values[1] ) << 8) | Byte( temp.values[0] );
Тогда, если это больше, чем верхний диапазон для дополнения 16-битных двух, вычтите 2 16 :
int const i = int(u >= (1u << 15)? u - (1u << 16) : u);
Вы могли бы делать трюки на битовом уровне, но я не думаю, что в этом есть какой-то смысл.
Выше предполагается, что CHAR_BIT
= 8, что unsigned
больше 16 бит, и что машина и желаемый результат являются дополнением до двух.
#include <iostream>
using namespace std;
int main()
{
typedef unsigned char Byte;
struct { char values[2]; } const temp = { 56, 255 };
unsigned const u = (Byte( temp.values[1] ) << 8) | Byte( temp.values[0] );
int const i = int(u >= (1u << 15)? u - (1u << 16) : u);
cout << i << endl;
}