最近在樹莓派上做開發, 遇到了一個奇怪的問題
for example:
char a = 0x8f;
printf("%d", a);
我們希望得到 -113, 但是在樹莓派上面得到的卻是 143
這是怎麼回事? 怎麼不按照符號位進行擴展?
後來我查了下資料
如下:
ANSI C 提供了3種字符類型,分別是char、signed char、unsigned char
char相當於signed char或者unsigned char,但是這取決於編譯器!
這三種字符類型都是按照1個字節存儲的,可以保存256個不同的值。
不同的是取值范圍
signed char取值范圍是 -128 到 127
unsigned char 取值范圍是 0 到 255
signed char的最高位為符號位,因此char能表示-128~127, unsigned char沒有符號位,因此能表示0~255。
但是char究竟相當於signed char呢還是相當於unsigned char呢??
這就是char和int的不同之處!
int==signed int,但是char不能簡單以為==signed char
要確定char究竟等同什麼要基於不同的編譯器做測試
大多數機器使用補碼來存儲整數,在這些機器中按照整數類型存儲的-1的所有位均是1
假設我的機器也是如此存儲,就能據此判斷char究竟是等於signed char還是unsigned char
在實際使用過程種有什麼區別呢?
主要是符號位,但是在普通的賦值,讀寫文件和網絡字節流都沒什麼區別,反正就是一個字節,不管最高位是什麼,最終的讀取結果都一樣,只是你怎麼理解最高位而已,在屏幕上面的顯示可能不一樣。
但是我們卻發現在表示byte時,都用unsigned char,這是因為byte沒有符號位之說。
如果是char,那麼系統認為最高位是符號位,而int可能是16或者32位,那麼會對最高位進行擴展(注意,賦給unsigned int也會擴展),而如果是unsigned char,那麼不會擴展。
這就是二者的最大區別。