char的類型有幾種呢?無非是unsigned char 和signed char,是吧。讓我們用下面的程序來做個(gè)測(cè)試
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;
}
輸出內(nèi)容:unsigned char
signed char
Unknow
結(jié)果出乎意料,輸出內(nèi)容說明編譯器把unsigned char、signed char和char識(shí)別成三種不同的類型。
那么char類型是有符號(hào)還是無符號(hào)呢?通過下面的程序來求證一下(以下程序在Microsoft visual C++ 2003、windows 2003下編譯并運(yùn)行)。
int main()
{
char c = -1;
int i = c;
std::cout << i << std::endl;
return 0;
}
輸出內(nèi)容:-1
輸出內(nèi)容證明char是有符號(hào)的,但這并不可靠,各家的編譯器不保證
char都是signed或unsigned。可以用IDE修改char有符號(hào)還是無符號(hào),在Microsoft visual C++ 2003中,
通過“項(xiàng)目->屬性->C/C++->語言->默認(rèn)char無符號(hào)”進(jìn)行修改
總結(jié):C+
+中char、unsigned char和signed
char是三種類型,因此在函數(shù)重載和模板偏特化時(shí),應(yīng)注意重寫它們的三個(gè)版本。雖然它們是三種類型,但char不是unsigned
char就是signed char,且char是否有符號(hào)可由編譯器改變。因此不因編寫依賴char是有符號(hào)還是無符號(hào)的代碼。