在同一语句中向左和向右按位移位
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
,则您感觉需要删除高阶位的原因并不明显(尽管确实存在 int
和 char
大小相同。)
此外,正如 John Bollinger 所指出的,最终结果可能大于 char
所能容纳的大小,这在 char
的常见情况下没有明确定义签名类型。 (即使 unsigned int
是 32 位也是如此,因为从技术上讲,您不能将大于 127 的值分配给 8 位有符号字符。)
正如其他人所指出的,这是有效的语法。您可以通过以下方式实现我认为更易于理解和便携的效果:
unsigned char c2 = (i1 & 0xff0000) >> 16;
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
,则您感觉需要删除高阶位的原因并不明显(尽管确实存在 int
和 char
大小相同。)
此外,正如 John Bollinger 所指出的,最终结果可能大于 char
所能容纳的大小,这在 char
的常见情况下没有明确定义签名类型。 (即使 unsigned int
是 32 位也是如此,因为从技术上讲,您不能将大于 127 的值分配给 8 位有符号字符。)
正如其他人所指出的,这是有效的语法。您可以通过以下方式实现我认为更易于理解和便携的效果:
unsigned char c2 = (i1 & 0xff0000) >> 16;