C语言按位取反原理
正數取反是先將初始數值轉換成二進制數(6==》00000110),再對二進制數的每一位取反:即將0變為1、將1變為0。(00000110==》11111001),得到的是最終結果的補碼,要轉換為最終結果的原碼則需再次取補碼,就能得到計算結果;負數取反是先將初始數值轉換成二進制數(以-6為例,10000110),再取得二進制數的補碼,之后對補碼的每一位取反:即將0變為1、將1變為0。得到的是最終結果的補碼,要轉換為最終結果的原碼則需再次取補碼,就能得到計算結果。
補碼:正數的補碼等于它的原碼;負數的補碼等于反碼+1
# include <stdio.h> int main() { unsigned char a=18,b;b=~a;printf(“~a=%d”,b); return 0; }運行結果為: ~a= 237
#include <stdio.h> int main() { char a=18,b; b=~a;printf(“~a=%d”,b); return 0; }運行結果:-19
注意:
前一個程序結果很好理解,后一個因為a是帶符號數據,因此~a=(11101101)2的結果是一負數的補碼,轉換為原碼時,第1位符號位不變,對剩余的部分先減1,再全部取反,因此得到的二進制原碼為:10010011,即十進制的-19。
在計算機中操作的是補碼
對6取反(~6)
6的原碼 0000 0000 0000 0000 0000 0000 0000 0110
6的反碼 0000 0000 0000 0000 0000 0000 0000 0110
6的補碼 0000 0000 0000 0000 0000 0000 0000 0110
計算機只能對補碼操作,那么對6取反(~6),實際操作的是補碼,每位取反
6的補碼全部取反 1111 1111 1111 1111 1111 1111 1111 1001 (得到的這個數是最高為代表負數)
補碼–>反碼 -1 1111 1111 1111 1111 1111 1111 1111 1000
反碼–>原碼 取反 1000 0000 0000 0000 0000 0000 0000 0111
故~6=-7
已知補碼如何求原碼(真值)~
正數的補碼反碼與原碼相同。
若已知補碼為 1111 1000,如何求其原碼呢?
(1)方法1:求負數 原碼--->補碼 的逆過程。
????????注意:符號位保持不變!
????(A)先 - 1,得到 1111 0111
????(B)取反(符號位保持不變,其他位置按位取反?),得到?1000 1000
(2)方法2:
????????注意:符號位保持不變!
????(A)將這個二進制數中(即 1111 1000),除了符號位,其余位置按位取反,得 1000 0111
????(B)+ 1,得到 1000 1000
總結:
????????-1 后,再取反???和 取反后,再+1??的效果是一樣的。
???????這就和??-(3-1)??和 (-3 +1)?是一個道理。
?
?
?
?
?
總結
- 上一篇: object detection训练自己
- 下一篇: pymysql.err.Internal