当前位置:  开发笔记 > 编程语言 > 正文

char!=(signed char),char!=(unsigned char)

如何解决《char!=(signedchar),char!=(unsignedchar)》经验,为你挑选了4个好方法。

下面的代码编译,但char类型的行为与int类型的行为不同.

特别是

   cout << getIsTrue< isX::ikIsX  >() << endl;
   cout << getIsTrue< isX::ikIsX  >() << endl;
   cout << getIsTrue< isX::ikIsX  >() << endl;

导致三种类型的模板的3个实例化:int8,uint8和char.是什么赋予了?

对于ints来说也是如此:int和uint32导致相同的模板实例化,而signed int则是另一个.

原因似乎是C++将char,signed char和unsigned char视为三种不同的类型.而int与signed int相同.这是对的还是我错过了什么?

#include 

using namespace std;

typedef   signed char       int8;
typedef unsigned char      uint8;
typedef   signed short      int16;
typedef unsigned short     uint16;
typedef   signed int        int32;
typedef unsigned int       uint32;
typedef   signed long long  int64;
typedef unsigned long long uint64;

struct TrueType {};
struct FalseType {};

template 
struct isX
{
   typedef typename T::ikIsX ikIsX;
};


// This  int==int32 is ambiguous
//template <>            struct isX    { typedef FalseType ikIsX; };  // Fails
template <>            struct isX  { typedef FalseType ikIsX; };
template <>            struct isX  { typedef FalseType ikIsX; };


// Whay isn't this ambiguous? char==int8
template <>            struct isX  { typedef FalseType ikIsX; };
template <>            struct isX  { typedef FalseType ikIsX; };
template <>            struct isX  { typedef FalseType ikIsX; };


template  bool getIsTrue();
template <>           bool getIsTrue() { return true; }
template <>           bool getIsTrue() { return false; }

int main(int, char **t )
{
   cout << sizeof(int8) << endl;  // 1
   cout << sizeof(uint8) << endl; // 1
   cout << sizeof(char) << endl;  // 1

   cout << getIsTrue< isX::ikIsX  >() << endl;
   cout << getIsTrue< isX::ikIsX  >() << endl;
   cout << getIsTrue< isX::ikIsX  >() << endl;

   cout << getIsTrue< isX::ikIsX  >() << endl;
   cout << getIsTrue< isX::ikIsX  >() << endl;
   cout << getIsTrue< isX::ikIsX  >() << endl;

}

我正在使用g ++ 4.something



1> Greg Rogers..:

以下是标准的答案:

3.9.1基本类型[basic.fundamental]

声明为characters(char)的对象应足够大,以存储实现的基本字符集的任何成员.如果此组中的字符存储在字符对象中,则该字符对象的整数值等于该字符的单个字符文字形式的值.实现定义char对象是否可以保存负值.可以显式声明字符unsignedsigned.平原char,signed charunsigned char三种不同的类型. A char,a signed char和a unsigned char 占用相同数量的存储空间并具有相同的对齐要求(basic.types); 也就是说,它们具有相同的对象表示.对于字符类型,对象表示的所有位都参与值表示.对于无符号字符类型,值表示的所有可能位模式表示数字.这些要求不适用于其他类型.在任何特定实现中,普通char对象可以采用与a signed char或a相同的值unsigned char; 哪一个是实现定义的.



2> Johannes Sch..:

对于这样的问题,我想查看C的基本原理文档,它通常也提供了C++奥秘的答案,在阅读标准时有时会出现.它有这样的说法:

指定了三种类型的char:signed,plain和unsigned.普通字符可以表示为有符号或无符号,这取决于实现,如在先前实践中那样.引入了类型signed char,以便在将纯字符号作为unsigned实现的系统上提供一个单字节有符号整数类型.出于对称的原因,允许将关键字signed作为其他整数类型的类型名称的一部分.

C的基本原理



3> Drew Dormann..:

虽然大多数整数类型喜欢short并且int默认为存在signed,char但在C++中没有默认标志.

这是C++程序员在使用char8位整数类型时遇到的常见错误.


用于比较short和int的+1.

4> Evan Teran..:

这是正确的,char,unsigned charsigned char是不同的类型.如果char它只是一个同义词signed charunsigned char取决于你的编译器实现,它可能会很好,但标准说它们是不同的类型.

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有