C语言按位取反原理
正數(shù)取反是先將初始數(shù)值轉(zhuǎn)換成二進制數(shù)(6==》00000110),再對二進制數(shù)的每一位取反:即將0變?yōu)?、將1變?yōu)?。(00000110==》11111001),得到的是最終結果的補碼,要轉(zhuǎn)換為最終結果的原碼則需再次取補碼,就能得到計算結果;負數(shù)取反是先將初始數(shù)值轉(zhuǎn)換成二進制數(shù)(以-6為例,10000110),再取得二進制數(shù)的補碼,之后對補碼的每一位取反:即將0變?yōu)?、將1變?yōu)?。得到的是最終結果的補碼,要轉(zhuǎn)換為最終結果的原碼則需再次取補碼,就能得到計算結果。
補碼:正數(shù)的補碼等于它的原碼;負數(shù)的補碼等于反碼+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是帶符號數(shù)據(jù),因此~a=(11101101)2的結果是一負數(shù)的補碼,轉(zhuǎn)換為原碼時,第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 (得到的這個數(shù)是最高為代表負數(shù))
補碼–>反碼 -1 1111 1111 1111 1111 1111 1111 1111 1000
反碼–>原碼 取反 1000 0000 0000 0000 0000 0000 0000 0111
故~6=-7
已知補碼如何求原碼(真值)~
正數(shù)的補碼反碼與原碼相同。
若已知補碼為 1111 1000,如何求其原碼呢?
(1)方法1:求負數(shù) 原碼--->補碼 的逆過程。
????????注意:符號位保持不變!
????(A)先 - 1,得到 1111 0111
????(B)取反(符號位保持不變,其他位置按位取反?),得到?1000 1000
(2)方法2:
????????注意:符號位保持不變!
????(A)將這個二進制數(shù)中(即 1111 1000),除了符號位,其余位置按位取反,得 1000 0111
????(B)+ 1,得到 1000 1000
總結:
????????-1 后,再取反???和 取反后,再+1??的效果是一樣的。
???????這就和??-(3-1)??和 (-3 +1)?是一個道理。
?
?
?
?
?
總結
- 上一篇: object detection训练自己
- 下一篇: 服务器测试网址填写注意事项