将无符号字符转换为有符号整数

时间:2011-01-24 13:12:08

标签: c arrays char int

我有一个带有2个元素的unsigned char数组,表示有符号整数。如何将这2个字节转换为有符号整数?

编辑:unsigned char数组采用little endian

4 个答案:

答案 0 :(得分:6)

为了最大限度地提高安全性,请使用

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

for big endian。对于小端,交换c[0]c[1]

(解释:我们将c[0]处的字节解释为signed char,然后算术左移以便携方式移动,然后加入c[1]。)

答案 1 :(得分:5)

将它们包装在一个联盟中:

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

现在填充数组后,您可以将其用作number.smt

答案 2 :(得分:2)

取决于字节顺序。 大端的东西:

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

小端的东西:

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

答案 3 :(得分:1)

便携式解决方案:

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位,2的补码,大端符号整数。如果它们是小端整数,则只需交换c[1]c[0]

(在极不可能的情况下,它是'补码',使用65535代替65536作为要减去的值。符号幅度留给读者练习;)