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;
答案 0 :(得分:7)
语法很好(虽然难以阅读),但它将被解析为c2 = (i1 << 8) >> 24
。
因此它将向左移位i1
8个位置,从而将最左边的8位移离左边缘,然后右移结果24个位置,从而将最右边的16位移出右边缘。如果这就是你想要的,那么你就是好的。我会使用括号使其更具可读性。
如果您要将其转换为char
,那么为什么您觉得需要删除高阶位并不明显(尽管可能存在{{1}的体系结构}和int
大小相同。)
另外,正如John Bollinger所指出的那样,最终结果可能大于char
中的最终结果,char
在char
签名的常见情况下没有明确定义类型。 (即使unsigned int
为32位也是如此,因为从技术上讲,您不能将大于127的值分配给8位有符号字符。)
答案 1 :(得分:1)
是的,这是一种有效的语法。对于带符号的int i1
,它也是一种有效的语法,在这种情况下,您可以使用所选位置的位来填充值的“上部”。
答案 2 :(得分:1)
正如其他人所说,它是有效的语法。您可以通过以下方式实现我认为更易理解和便携的效果:
unsigned char c2 = (i1 & 0xff0000) >> 16;