- 取反(~)
屬於按位邏輯運算符,屬於一元運算符,其本質其實就是將數據每一位按位取反,即將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、簡單結果分析二
相反數直接關於環形對稱。同樣其他的數據類型也是同樣的性質,只是數據範圍變大了。簡單粗暴!