为什么相同的类型不同
Why same types are different?
为什么这个(char在我的实现上签名):
cout << std::is_same< char,signed char>::value;
输出假吗?
这三种类型是在不同时期引入的。
来自C99 Rational:
指定三种类型的
char
:signed
, plain,unsigned
。普通的char
可以表示为有符号的或无符号的取决于实现,如在先前的实践中。类型signed char
为在C89中引入,以便在以下系统上提供一字节的有符号整数类型实现普通char
作为unsigned char
.
它们必须在c++中保持不同的类型,以允许char
的重载是可移植的。
如果您正在使用Visual Studio,请参阅这里:http://msdn.microsoft.com/en-us/library/cc953fe1.aspx
c++编译器将变量处理为类型char, signed char和unsigned字符有不同的类型。char类型的变量被提升为就好像它们是带符号的char by类型默认,除非/J编译选项。在这种情况下,它们是被视为unsigned char类型和晋升为int无符号扩展。
[Edit]直接来自ISO c++ 0x标准,第3.9.1段(第71页,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf):
字符可以显式声明未签名的或签名的。普通字符,带符号Char和unsigned Char共有三种不同的类型。
char
, signed char
和unsigned char
是三种不同的类型,即使char
的解释方式与编译器解释signed char
的方式相同。
§3.9.1/1从c++标准中说
Plain char、signed char和unsigned char是三种不同的类型。
换句话说,不要认为char
是signed char
的缩写形式,因为它不是。
只是为了强调类型如何可以不同,尽管它们的位解释相同,考虑以下两个结构体:
struct A
{
int i;
};
struct B
{
int i;
};
它们是一样的吗?当然不是。同样,char
和signed char
是不同的类型。
试试这个:
cout << std::is_same<A,B>::value;
c++标准(引用工作草案№3225,2010-11-27)
3.9.1基本类型普通字符、有符号字符和无符号字符Char是三种不同的类型。
这取决于实现,但如果我没记错的话,我在某处读到这两个应该是不同的,以便区分c类型字符串和8位有符号数
- 使用简单类型列表实现的指数编译时间.为什么
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 包含的类类型显然没有声明,为什么?
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- NTTP 的结构类型:为什么所有成员都必须是公共的?
- 为什么 std::bitset 只支持整型数据类型?为什么不支持浮点数?
- C++异常返回类型为什么字符*
- 线程之间的Qt连接类型:为什么这样做
- 无效使用不完整的类型-为什么在这种情况下没有错误