程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 樹莓派(ARM處理器), 符號位擴展的問題

樹莓派(ARM處理器), 符號位擴展的問題

編輯:C++入門知識

最近在樹莓派上做開發, 遇到了一個奇怪的問題

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,那麼不會擴展。

這就是二者的最大區別。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved