[英]Java long comparison and casting
我正在編寫一段代碼,檢查一種特定類型的通信的包頭是否在所有字段中都包含有效信息。 現在,我需要確保4字節字段的最左邊字節為1,下一個字節為0,其余的我都不在乎。 這是我要嘗試的方法:
private static boolean validateCheckSumControl(packetHeader packetHeader) {
long mask = 0xC0000000;
long control = packetHeader.getControl();
long masked = mask & control;
if (masked == 0x80000000) {
return true;
}
System.err.println("Incorrect control field!");
return false;
}
掩碼的前四個字節為零,然后為兩個一位,然后再為零,因此,將其與數據包頭中的控制字段相加,將使兩位不變,並將其他所有內容都設置為零。 如果結果不是第五個字節的第一位為1,則輸出錯誤消息並返回false。 問題是,即使控制字段包含的是與我比較的值,該代碼也會返回false。 但是,如果我將0x80000000替換為0x80000000l,則效果很好。
所以,這是我的問題-Java為什么不自行執行適當的轉換? 否則,為什么會給出錯誤的結果?
您使用整數常量作為掩碼和值。 由於它們表示負整數,因此在將它們轉換為長值時會得到符號擴展。 因此0xC0000000
實際上變成0xFFFFFFFFC0000000L
並且0x80000000
變成0xFFFFFFFF80000000L
。 如果使用0x80000000L
則將其解釋為0x0000000080000000L
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.