C语言问题中两个8位二进制数合成一个16位二进制数的问题

unsigned int temp;
unsigned char a,b;
mian()
{
temp=(a<<8)|b;
}
这个是把两个8位二进制数合成一个16为二进制数吗?是的话有一点不明白:a左移8位后不就变成8位都为0的二进制数了吗,然后和b按位或怎么是16位二进制数呢?
还是a左移8位后变成16位二进制数了,低八位全为0.
C语言中对8位二进制数左移,移出的高位不是舍弃吗?但为什么变成16位的二进制数了呢

a<<8; //这是a的值左移8位, 而不是a左移了8位,a并没有变哦
a<<8 返回的值是一个int
可以这样做个测试:
printf("%d",sizeof(a<<8);
16位编译器会输出2
32位编译器会输出4
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-08-05
如果a是字符型,左移8位倒是真的变成0了,但是一般情况下字符型参与运行自动用整数来进行,所以这个问题就不存在了,不过最好这样:
(unsigned int)a << 8 | b
相似回答