C語言之取反和取相反數

  • 取反(~)
    屬於按位邏輯運算符,屬於一元運算符,其本質其實就是將數據每一位按位取反,即將0變成1,將1變成0;
    1、 簡單代碼做一下測試:
 char val = 2;
 char test = 0;
 unsigned char unval = 0;
 test = ~val;
 unval = ~val;
 printf("val5 = %d\n", test); 
 printf("val5 = %d\n", unval); 

2、結果如下:
編譯結果
3、簡要分析:
變量val的值爲2,其在計算機內部是以補碼的形式存在的
原碼:0000 0010
反碼:0000 0010
補碼:0000 0010
~val取反後,(是對補碼進行取反)
補碼:1111 1101
反碼:1111 1100
原碼:1000 0011 = -3
所以將char val取反後賦值給char test,其值爲-3;
但將其取反後賦值給unsigned char unval,涉及到同類型的有符號向無符號轉換,值爲-3 + 28 = 253;

- 取相反數 (-)
此時的“-”是作爲符號運算符,屬於一元運算符,
1、簡單代碼測試:

// An highlighted block
 char val = -2;
 char test = -128;
 unsigned char unval1 = 2;
 unsigned char unval2 = 128;
 
 val = -val;
 test = -test;
 unval1 = -unval1;
 unval2 = -unval2;
 
 printf("-val = %d\n", val); 
 printf("-test = %d\n", test); 
 printf("-unval1 = %d\n", unval1); 
 printf("-unval1 = %d\n", unval2); 

2、結果如下:
在這裏插入圖片描述
3、簡單結果分析一:
因爲是一元運算符,對其取相反數現在也不太明白具體是如何實現的,只說說我的理解,簡單粗暴,可能不對,但對大多數情況都適用
在負號前面加0,進行減法運算(0-數據補碼)
如val = -2
原碼:1000 0010
反碼:1111 1101
補碼:1111 1110
求相反數,-val = 2
即0000 0000 - 1111 1110 = 0000 0010 (等於2)

如test =-128
補碼:1000 0000
求相反數 -test = -128
即0000 0000 - 1000 0000 = 1000 0000 (等於-128)
後面的數據轉換與上述分析類似;

4、簡單結果分析二
相反數直接關於環形對稱。同樣其他的數據類型也是同樣的性質,只是數據範圍變大了。簡單粗暴!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章