为什么这个(char在我的实现上签名):
cout << std::is_same< char,signed char>::value;
输出错误?
答案 0 :(得分:6)
这三种类型是在不同时间引入的。
来自C99理性:
指定了三种
char
类型:
signed
,简单和unsigned
。普通char
可以表示为有符号或无符号 取决于实施,如在先前的实践中。类型signed char
是 在C89中引入,在那些系统上提供一个单字节有符号整数类型 将char
简化为unsigned char
。
他们必须在C ++中保持不同的类型,以允许char
上的重载是可移植的。
答案 1 :(得分:4)
如果您使用的是Visual Studio,请参阅此处:http://msdn.microsoft.com/en-us/library/cc953fe1.aspx
C ++编译器处理的变量 键入char,签名 char和unsigned char有不同的类型。 char类型的变量被提升为 int好像它们是由char类型签名的 默认情况下,除非/ J编译 使用选项。在这种情况下,他们是 被视为类型unsigned char并且是 无标志地提升为int 扩展
[编辑] 直接来自ISO C ++ 0x标准,第3.9.1段(第71页,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf):
可以显式声明字符 未签名或签名。简单的char,签名 char和unsigned char是三个 不同的类型。
答案 2 :(得分:2)
char
,signed char
和unsigned char
是三种不同类型,即使char
的解释方式与{{1}相同}由您的编译器解释。
§3.9.1/ 1
Plain char,signed char和unsigned char是三种不同类型。
换句话说,不要将signed char
视为char
的缩写形式,因为它不是。
只是为了强调类型如何不同尽管它们的位解释相同,请考虑以下两种结构:
signed char
它们一样吗?当然不是。完全相同,struct A
{
int i;
};
struct B
{
int i;
};
和char
是不同的类型。
试试这个:
signed char
答案 3 :(得分:1)
C ++标准(引用工作草案№3225,2010-11-27)
3.9.1基本类型
普通字符,签名字符和未签名字符 char是三种不同的类型。
答案 4 :(得分:0)
这取决于实现,但是如果我没记错的话,我会读到这两个应该不同的地方,以区分c类型字符串和8位有符号数。