我有一个带有2个元素的unsigned char数组,表示有符号整数。如何将这2个字节转换为有符号整数?
编辑:unsigned char数组采用little endian
答案 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
作为要减去的值。符号幅度留给读者练习;)