Некоторые сведения о типах данных ( un ) со знаком short и char :
char - это 8-битное значение, которое вы ищете lsb и msb . short имеет длину 16 бит.
Вы также не должны хранить значения со знаком в без знака значения, за исключением того, что вы знаете, что делаете.
Вы можете взглянуть на дополнение к двум . Он описывает представление отрицательных значений (для целых чисел, а не для значений с плавающей запятой) в C / C ++ и многих других языках программирования.
Существует несколько версий создания собственных дополнений:
int a;
// setting a
a = -a; // Clean version. Easier to understand and read. Use this one.
a = (~a)+1; // The arithmetical version. Does the same, but takes more steps.
// Don't use the last one unless you need it!
// It can be 'optimized away' by the compiler.
stdint.h (с inttypes.h) больше для точной длины переменной. Если вам действительно нужна переменная определенной длины в байтах, вы должны использовать ее (здесь она вам нужна).
Вы должны все время использовать типы данных, которые наилучшим образом соответствуют вашим потребностям. Ваш код должен выглядеть следующим образом:
signed char lsb; // signed 8-bit value
signed char msb; // signed 8-bit value
signed short combined = msb << 8 | (lsb & 0xFF); // signed 16-bit value
или как это:
#include <stdint.h>
int8_t lsb; // signed 8-bit value
int8_t msb; // signed 8-bit value
int_16_t combined = msb << 8 | (lsb & 0xFF); // signed 16-bit value
В последнем случае компилятор будет использовать 8/16-битные значения со знаком каждый раз, независимо от того, какую длину int имеет на вашей платформе. Википедия получила хорошее объяснение типов данных int8_t и int16_t (и всех других типов данных).
btw: cppreference.com полезен для поиска стандартов ANSI C и других полезных сведений о C / C ++.