按位取反與型別問題

2021-08-21 10:48:57 字數 701 閱讀 5571

#include

#include

#include

int main()

{uint8_t a = 2;

uint8_t b = ~a;

//轉換為int時,自動在前面補0

printf("%d\n", b);

printf("%d\n", ~a);

system("pause");

return 0;

輸出結果: 

-3-3

學習位運算,時,執行上述程式,竟然結果不一樣. 發現時型別問題

~2也就是~a是對於整型int而言的2按位取反, 

int 4位元組, 32位, 

2對應二進位制: 0000 0000 0000 0000 0000 0000 0000 0010

取反得到 -3:  1111 1111 1111 1111 1111 1111 1111 1101

而uint8_t或者unsigned char為一位元組, 8位

a = 2在記憶體中儲存形式: 0000 0010

對a按位取反得到b        :1111  1101, 也就是乙個位元組意義上的253

然後按%d十進位制整數,十進位制int整型輸出, 系統會於是將8位的b: 1111 1101補零拓展為0000 0000 0000 0000 0000 0000 0000 1111 1101, 即int型的253;

按位與 按位異或 按位取反

按位與 按位或 按位異或 1.按位與運算 按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 否則為0。參與運算的數以補碼方式出現。例如 9 5可寫算式如下 00001001 9的二進位制補碼 00000101 5的二進位制補碼 0000...

按位與 按位異或 按位取反 分析

按位與 按位或 按位異或 1.按位與運算 按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 否則為0。參與運算的數以補碼方式出現。例如 9 5可寫算式如下 00001001 9的二進位制補碼 00000101 5的二進位制補碼 0000...

python 中按原碼取反 按位取反

在python中,按位運算的結果與c c 中位運算結果不同,原因主要是c c 是按原碼來取反。而在python中,取反的運算的流程是這樣的 先獲得其二進位制 原碼 進行取反操作。將第一步的結果,當作補碼。求這個補碼的原碼,這個原碼就是輸出的結果。補 碼求原碼的過程,先減1,再取反。由於是這樣的邏輯,...