Преобразование символов без знака в целое число со знаком - PullRequest
6 голосов
/ 24 января 2011

У меня есть массив без знака с двумя элементами, представляющими целое число со знаком. Как я могу преобразовать эти 2 байта в целое число со знаком?

Редактировать : Массив unsigned char имеет младший порядок

Ответы [ 4 ]

6 голосов
/ 24 января 2011

Для максимальной безопасности используйте

int i = *(signed char *)(&c[0]);
i *= 1 << CHAR_BIT;
i |= c[1];

для большого порядка Поменяйте местами c[0] и c[1] для порядкового номера.

(Пояснение: мы интерпретируем байт в c[0] как signed char, затем переносим арифметически влево, переносим его, затем добавляем c[1].)

5 голосов
/ 24 января 2011

оберните их в союз:

union {
  unsigned char a[2];
  int16_t smt;
} number;

Теперь после заполнения массива вы можете использовать это как number.smt

1 голос
/ 24 января 2011

Переносимое решение:

unsigned char c[2];
long tmp;
int result;

tmp = (long)c[0] << 8 | c[1];
if (tmp < 32768)
    result = tmp;
else
    result = tmp - 65536;

Предполагается, что байты в массиве представляют собой 16-битное, двоичное дополнение, целое число со знаком с прямым порядком байтов.Если они представляют собой целое число с прямым порядком байтов, просто поменяйте местами c[1] и c[0].

(В крайне маловероятном случае, если это дополнение, используйте 65535 вместо 65536 в качестве значения длявычесть. Величина знака оставлена ​​как упражнение для читателя;)

1 голос
/ 24 января 2011

Это зависит от порядка байтов.Что-то для старшего байта:

unsigned char x[2];
short y = (x[0] << 8) | x[1]

Что-то для младшего байта:

unsigned char x[2];
short y = (x[1] << 8) | x[0]
...