1. 程式人生 > >gnu linux 上ARM預設char是不帶符號.

gnu linux 上ARM預設char是不帶符號.

 C標準表示char型別可以帶符號也可以不帶符號,由具體的編譯器、處理器或由它們兩者共同決定到底char是帶符號合適還是不帶符號合適。
大部分體系結構上,char預設是帶符號的,它可以自-128到127之間取值。而也有一些例外,比如ARM體系結構上,char就是不帶符號的,它的取值範圍是0~255
舉例來說,在預設char不帶符號,下面的程式碼實際會把255而不是-1賦予i:
char i = -1;
而另一種機器上,預設char帶符號,就會確切地把-1賦予i。如果程式設計師本意是把-1儲存在i中,那麼前面的程式碼就該修改成:
signed char i = -1;
    另外,如果程式設計師確實希望儲存255,那麼程式碼應該如下:



unsigned char = 255;

   如果你在自己的程式碼中使用了char型別,那麼你要保證在帶符號和不帶符號的情況下程式碼都沒問題。如果你能明確要用的是哪一個,那麼就直接宣告它。

通常我們要定義無符號的整數需要加unsigned關鍵字,如:unsigned int/long/short等,如果沒有unsigned的,就是有符號整數,也就是說int/long/short預設為有符號。然後對於char就不是這麼簡單了。其實這種預設取決於我們用的編譯器和平臺,ARMGCCchar做了相反的預設定義,當我們定義char ch;時ch是一個unsigned char

這樣來說,之前的程式碼應該沒有問題才對呀?但是這裡面還是至少有兩個問題:

1.     會有跨平臺移植的問題,這個比較簡單,不多說。

2.     即便是ARM平臺下,我們也是可以通過-fsigned-char編譯引數設定char的預設模式為signed char

這裡我們也可以看出許多公司定義coding rule的意義。在實踐中我們通常都定義:

typedef unsigned char uint8_t;

typedef signed char int8_t;

之後我們就不要直接使用char了。