[英]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 char
與char
,如果它的signed
必須是2的補數。)
為了生活輕松,只寫
BUF[1] * 256 + BUF[0]
請注意,此表達式的類型為int
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.