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

Bitwise shift left and right in the same statement

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;

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

语法很好(虽然难以阅读)并且会被解析为c2 = (i1 << 8) >> 24

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

如果您只是将其转换为 char,则您感觉需要删除高阶位的原因并不明显(尽管确实存在 intchar 大小相同。)

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

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

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