在C中,默認的基礎數據類型均為signed,如定義變量為int,long等,都為有符號的。如果要定義無符號類型,必須顯式地在變量類型前加unsigned。
char在我所用的linux中一般都是8位一個字節,表示范圍為-128~127。
unsigned char的表示范圍為0~255。
而ASCII的最大值是127。因此我們如果使用char去表示字符,那么char和unsigned char是沒有區別的。
當然如果去表示超過127的數,那么就會差別的。
注意:
如果直接用於數據傳輸,本質上unsigned char 和 char是沒有區別的。。。因此傳輸過去的數據是什么,接收到的數據就是什么。
但是如果數據要用於顯示,那就有區別。比如0xFF,在unsigned char用printf打印出來是255,而char是-1。
但是看過別人的一個博客,里面有指出,把一個char類型的變量賦值給int、long等數據類型或進行類似的強制類型轉換時時,系統會進行類型擴展,這時區別就大了。對於char類型的變量,系統會認為最高位為符號位,然后對最高位進行擴展,即符號擴展。若最高位為1,則擴展到int時高位都以1填充。對於unsigned char類型的變量,系統會直接進行無符號擴展,即0擴展。擴展的高位都以0填充。所以在進行類似的操作時,如果char和unsigned char最高位都是0,則結果是一樣的,若char最高位為1,則結果會大相徑庭。
以上轉載自https://blog.csdn.net/guotianqing/article/details/77341657
(注意:C語言中如果是有符號數,那么最高位為1時,表示負數)
簡單的來說就是當char和unsigned char都要強制轉換成int類型(雖然正常也不會直接把unsigned char轉換成int),這個時候如果兩個最高位都是0,就都沒問題。但是如果最高位都為1,那么char轉換成int是沒問題。但是unsigned char轉換就會把最高位的1當做符號位。
最簡單的舉例就是unsigned char:1000_0001,十進制就是129,那么轉換成int類型后十進制就是-1。
應該沒人會這么干,但是也要注意一下。