刚毕业找工作面试遇到这个问题,正确答案是“不一定,与编译器相关”。这个结论是我在工作多年后才知道的。
C++标准中列出了三种类型:(plain) char, signed char 和 unsigned char。第一种就是普通的char不加前缀,实际对应后两种实现的其中一种,取决于编译器,有的甚至提供编译选项指定是否有符号。我猜测实际中大多数都是对应signed有符号的版本。
与此不同的是,size_t在C或者C++标准中明确指出是无符号,而ssize_t是有符号的。
对于原先的问题,其实换一个问法更好:如何通过代码验证char是否有符号?
下面是一个简单实现:
1 #include <iostream> 2 3 template<class T> bool isSigned() { return (T)-1 < (T)0; } 4 5 int main() 6 { 7 std::cout << isSigned<char>() << std::endl; 8 std::cout << isSigned<signed char>() << std::endl; 9 std::cout << isSigned<unsigned char>() << std::endl; 10 return 0; 11 }
我在Windows上用g++编译的程序输出是1 1 0.