char的類型有幾種呢?無非是unsigned char 和signed char,是吧。讓我們用下面的程序來做個測試

template<typename T>
struct Type
{
    inline 
static void print()
    {
        std::cout 
<< "Unknow" << std::endl;
    }
};

template
<>
struct Type<signed char>
{
    inline 
static void print()
    {
        std::cout 
<< "signed char" << std::endl;
    }
};

template
<>
struct Type<unsigned char>
{
    inline 
static void print()
    {
        std::cout 
<< "unsigned char" << std::endl;
    }
};

int main()
{
    Type<unsigned char>::print();
    Type
<signed char>::print();
    Type
<char>::print();
    
    
return 0;
}

輸出內容:
unsigned char
signed char
Unknow

結果出乎意料,輸出內容說明編譯器把unsigned char、signed char和char識別成三種不同的類型。
那么char類型是有符號還是無符號呢?通過下面的程序來求證一下(以下程序在Microsoft visual C++ 2003、windows 2003下編譯并運行)。

int main()
{
    
char c   = -1;
    
int i    = c;

    std::cout 
<< i << std::endl;

    
return 0;
}

輸出內容:
-1

輸出內容證明char是有符號的,但這并不可靠,各家的編譯器不保證 char都是signed或unsigned。可以用IDE修改char有符號還是無符號,在Microsoft visual C++ 2003中, 通過“項目->屬性->C/C++->語言->默認char無符號”進行修改

總結:

C+ +中char、unsigned char和signed char是三種類型,因此在函數重載和模板偏特化時,應注意重寫它們的三個版本。雖然它們是三種類型,但char不是unsigned char就是signed char,且char是否有符號可由編譯器改變。因此不因編寫依賴char是有符號還是無符號的代碼。