簡體   English   中英

如何 操作員工作?

[英]How does the | operator work?

我對|感到困惑 C ++中的運算符。 我有代碼來傳輸從MCU讀取的數據。 高8位與低8位分開。 並且數據(代碼中的BUF)存儲補碼。 所以我用(BUF[1] << 8) | BUF[0] (BUF[1] << 8) | BUF[0]獲取我的原始數據。 但是,結果有點奇怪。 例如,現在的代碼為d1=-84 如圖所示,為什么| 運算符是否可以根據需要獲得結果? 在此處輸入圖片說明

#include <cstdlib>
#include <cstdio>
#include <cmath>
#include<iostream>

int main() {
    signed char BUF[2];
    BUF[0] = -84;
    BUF[1] = -2;
    short d1;
    d1 = (BUF[1] << 8) | BUF[0];  // | operator
    std::cout << d1 << std::endl;
    std::cin.get();
}

您不能左移負數,這樣做會引起未定義的行為:任何事情都會發生。 同樣,右移負數也是一個壞主意,因為這可能導致算術或邏輯右移。

您必須將變量轉換為無符號類型,進行移位,然后再轉換回去。 例如:

d1 = ((uint32_t)BUF[1] << 8) ...

左移負數的行為是不確定的 ,並且在C ++ 14之前,您容易受到帶signed char不同補碼方案的攻擊。 (從C ++ 14 signed charchar ,如果它的signed必須是2的補數。)

為了生活輕松,只寫

BUF[1] * 256 + BUF[0]

請注意,此表達式的類型int

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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