在同一语句中左右按位移位

时间:2015-09-28 21:40:55

标签: c bit-manipulation

char c2=i1<<8>>24;有效的C语法吗? (其中i1是无符号整数)此外,它是否会产生分别向右移位i1 8位和向右移位24位的结果?我正在解包之前存储在i1中的字符以及其他三个字符。代码如下:

unsigned char b3 = 202;
unsigned char b2 = 254;
unsigned char b1 = 186;
unsigned char b0 = 190;
...


unsigned int i1=202;
i1=i1<<8;
i1=i1+254;
i1=i1<<8;
i1=i1+186;
i1=i1<<8;
i1=i1+190;
...

char c1=i1>>24;
char c2=i1<<8>>24;

3 个答案:

答案 0 :(得分:7)

语法很好(虽然难以阅读),但它将被解析为c2 = (i1 << 8) >> 24

因此它将向左移位i1 8个位置,从而将最左边的8位移离左边缘,然后右移结果24个位置,从而将最右边的16位移出右边缘。如果这就是你想要的,那么你就是好的。我会使用括号使其更具可读性。

如果您要将其转换为char,那么为什么您觉得需要删除高阶位并不明显(尽管可能存在{{1}的体系结构}和int大小相同。)

另外,正如John Bollinger所指出的那样,最终结果可能大于char中的最终结果,charchar签名的常见情况下没有明确定义类型。 (即使unsigned int为32位也是如此,因为从技术上讲,您不能将大于127的值分配给8位有符号字符。)

答案 1 :(得分:1)

是的,这是一种有效的语法。对于带符号的int i1,它也是一种有效的语法,在这种情况下,您可以使用所选位置的位来填充值的“上部”。

答案 2 :(得分:1)

正如其他人所说,它是有效的语法。您可以通过以下方式实现我认为更易理解和便携的效果:

unsigned char c2 = (i1 & 0xff0000) >> 16;