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



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;

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

因此它将左移i1 8位,从而将最左边的8位移出左手边,然后右移结果24位,从而将最右边的16位移出右手边。如果这是你想要的,那你很好。我会用圆括号让它更容易读懂。

如果你只是想把它转换成char,为什么你觉得需要删除高阶位并不明显(尽管在某些架构中intchar的大小是相同的)

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

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

正如其他人所注意到的,它是有效的语法。使用

可以达到我认为更容易理解和更易于移植的效果:
unsigned char c2 = (i1 & 0xff0000) >> 16;

最新更新