簡體   English   中英

Java長時間比較和轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM