C語言中char和unsigned char的區別


  在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。

  應該沒人會這么干,但是也要注意一下。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM