2016-07-25 56 views
-1

我正在NetBeans IDE中使用C應用程序,應用程序基本上是客戶端 - 服務器模型。我根據來自客戶端的數據計算一些值,但在特定情況下,值計算失敗。而不是返回值65536的我得到的價值爲256某些語句在特定情況下在C程序中被跳過

以下是案例:

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 

這裏既有第三和第四語句是執行跳過,返回值是256,而不是65536.對於其餘的案例,從1到65535計算正確的值。請注意int是4個字節。

+3

該代碼將導致256不是65536。你爲什麼想到65536 – 4386427

回答

5

讓我們看看會發生什麼:

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也不做任何事情。

+0

從客戶端我從1發送連續數據包數起,直到接到命令停止。比如可以有數據包編號最多99999或更多。當數據包編號爲65536時,我的數據包編號爲256,因爲我的系統暫停,因爲它預計數據包編號爲65536.如何解決我的問題。 Plz提供任何想法。 –

+0

@Asusgates:我不明白評論,對不起。你有什麼問題?你不能簡單地計數,即'0,1,2,3 ... 99999'。你在換班時想達到什麼目的? –

+1

從@ aebudak的回答我看到你有4個8位字節,並希望將它們組裝成一個32位(無符號)整數。你爲什麼不簡單地這樣說,而不是讓人猜測? –

2

pckt_number |= 0 << 8被評估爲pckt_number |= (0 << 8),它是pckt_number |= 0

x | 0x任何x。因此x |= 0是無操作的。

因此,您標記爲//3//4的陳述是無操作。

1

Rudy Velthuis's answer完美地解釋它。如果我正確理解你所要做的事情可以這樣做。

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, 
+0

我會理解它是不是像'pckt_number | = a shr 24;'等等,但是'0 << 24'沒有任何意義。 –

+0

我從來沒有想過0和1是常數。因爲如果他們是'int pckt_number = 65536;'就足夠了。 – aebudak