在特定情况下,C程序中会跳过某些语句



我正在NetBeans IDE中开发一个C应用程序,该应用程序基本上是一个客户端-服务器模型。我根据客户的数据计算一些值,但在特定情况下,值计算失败。我得到的值不是65536,而是256。

情况如下:

int pckt_number = 0; //size of int is 4 bytes.
        pckt_number = 0 << 8 ; // 1
        pckt_number |= 1 << 8; //2
        pckt_number |= 0 << 8 ; //3
        pckt_number |= 0; //4

在这里,第3条和第4条语句都被跳过执行,并且值被返回为256而不是65536。对于从1到65535的其余情况,将计算正确的值。请注意,int是4字节。

让我们看看会发生什么:

int pckt_number = 0;     // 0
pckt_number |= 0 << 8;   // pckt_number = pckt_number | 0    --> still 0
pckt_number |= 1 << 8;   // pckt_number = pckt_number | 256  --> 256
pckt_number |= 0 << 8;   // pckt_number = pckt_number | 0    --> still 256
pckt_number |= 0;        // pckt_number = pckt_number | 0    --> still 256

最后两项声明根本没有任何作用。它们不会被"跳过"。第一行pckt_number |= 0 << 8也不起任何作用。

pckt_number |= 0 << 8被评估为pckt_number |= (0 << 8),即pckt_number |= 0

对于任何xx | 0x。因此x |= 0是一个no-op。

因此,您标记为//3//4的语句不是操作。

Rudy Velthuis的回答完美地解释了这一点。如果我理解正确,你想做的事情可以这样做。
int pckt_number = 0;     // 0
pckt_number |= 0 << 24;  // most significant byte,  
pckt_number |= 1 << 16;  // second most significant byte,
pckt_number |= 0 << 8;   // third most significant byte,
pckt_number |= 0;        // least significant byte,

相关内容

  • 没有找到相关文章

最新更新