C語言之取反和取相反數

2021-10-05 21:20:14 字數 1884 閱讀 4315

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、簡單結果分析二

相反數直接關於環形對稱。同樣其他的資料型別也是同樣的性質,只是資料範圍變大了。簡單粗暴!

C語言萌新手記 相反數

練習進行時,ccf題號201403 1 相反數 這或許就是傳說中ccf的簽到題吧 然而昨天晚上貿然挑戰201312 2感覺還是自己菜得不行,就放棄了 逃 今天做個 簽到題 給自己找點信心哈哈哈。問題描述 有 n 個非零且各不相同的整數。請你編乙個程式求出它們中有多少對相反數 a 和 a 為一對相反數...

CCF201403 1相反數(C語言)

問題描述 有 n 個非零且各不相同的整數。請你編乙個程式求出它們中有多少對相反數 a 和 a 為一對相反數 輸入格式 第一行包含乙個正整數 n。1 n 500 第二行為 n 個用單個空格隔開的非零整數,每個數的絕對值不超過1000,保證這些整數各不相同。輸出格式 只輸出乙個整數,即這 n 個數中包含...

演算法設計與分析 求多少對相反數(C 實現)

求多少對相反數。有n個非零且各不相同的整數。請你編乙個程式求出它們中有多少對相反數 a和 a為一對相反數 時間限制為1.0s,記憶體限制 256mb。輸入格式 第一行包含乙個正整數n 1 n 500 第二行為n個用單個空格隔開的非零整數,每個數的絕對值不超過1000,保證這些整數各不相同.輸出格式 ...