2016-03-14 25 views
-2

我有两个字符值char_1char_2。现在我想将它们组合成16位有符号整数值,其中char_1包含MSB中的符号。2个字符来签名短

| SGN |位6 |位5 |位4 |位3 |位2 |位1 |位0 |位7 |位6 |位5 |位 4 |位3 |位2 |位1 |位0 |

|签名字符1 |其余的Char 1 | Char 2 |

我的尝试是:

signed short s = (((int)char_1) << 8) & (int)char_2; 

现在,我得到0 s ...

+0

请注意,您对整数大小的隐含假设是不可移植的。考虑从''使用固定宽度类型'std :: int8_t'和'std :: int16_t'。 – 5gon12eder

+0

假设'signed char'能够保存一个有符号的8位数,并且假设short将保存一个有符号的16位数是可移植的。 –

回答

5

你需要按位orand

(((int)char_1) << 8) | (int)char_2; 

既然你还面临着位,你应该也可以使用无符号类型(unsigned char,unsigned int,unsigned short)。

+0

我是个傻瓜。谢谢! – Christoph

+0

'char_2'必须是'(unsigned int)'。如果char在你的平台上被签名,并且char_1,char_2 == 1,0xff,那么你将以(1 << 8)|结束。 (-1)......这可能不是你想要的! –

0

联盟可能会实现更清洁的解决方案。

typedef union { short int s; char c[2];} Data; 

int main(){ 
     Data d; 
     d.c[0]=char_2; 
     d.c[1]=char_1; 
} 

注:这可能不是对你不够便携作为索引的顺序取决于架构字节顺序。我的例子在Little endian archs(即Intel 0x86)上运行良好,但是大端arch会打印char_2 char_1