備份自 http://www.cnblogs.com/wang-jingke/p/4186094.html html
平時工做中有符號數用的少,昨天同事在現場更改代碼須要用到有符號數,發回家裏後一會兒我也有點暈,又查查資料在IAR和VS中也驗證了下,作好ui
以下記錄。spa
C語言中無符號數和有符號數一塊兒比較、運算時,有符號數會隱式轉換到無符號數。orm
1.無符號數--->有符號數htm
首先判斷無符號數的最高位是否爲1,若是不爲1,則有符號數就直接等於無符號數;若是爲1,則將無符號數取補碼,獲得的數就是有符號數。
本質上就是無符號數在存儲器中的二進制數直接按照有符號數來解析。
現象上也可理解爲無符號數先當作有符號數而後取補碼。由於取補碼時符號位不變,正數的補碼就是原碼。blog
以unsigned char 和 signed char爲例子:get
定義 unsigned char ui; signed char si;it
1.1 將無符號數2轉爲有符號數
前提:
ui = 2;
si = ui;
結果:
si = 2;
2的原碼是:0000 0010,最高位不爲1,所以si = 0000 0010。二進制
1.2 無符號數130轉爲有符號數
前提:
ui = 130;
si = ui;
結果:
si = -126;
130的原碼是:1000 0010,最高位爲1,對其取補碼爲1111 1110,因此si = 1111 1110 值獲得的結果是-126。margin
2.有符號數--->無符號數
首先判斷有符號數的最高位是否爲1,若是不爲1,則無符號數就直接等於有符號數;若是有符號數的最高位爲1,則將有符號數取補碼,獲得的數就是
無符號數。
本質上是有符號數在存儲器中的二進制數直接按照無符號數來解析,
2.1 將有符號數3轉爲無符號數
前提:
si = 2;
ui = si;
結果:
ui = 2;
2的原碼是:0000 0010,可知最高位不爲1,所以ui = 0000 0010。
2.2 將有符號數-2轉爲無符號數
-2的在存儲器中按補碼存放的,二進制表示爲:1111 1110,此二進制數按照無符號數解析也就是首位再也不表示符號則該值爲254。
前提:
si = -2;
ui = si;
結果:
ui = 254;
另外,上述以char舉例,若是換成short或者int等等,要注意只有首位纔是符號位。