C++ c+中字符和有符号字符之间的差异+;?

C++ c+中字符和有符号字符之间的差异+;?,c++,c++11,char,signed,typetraits,C++,C++11,Char,Signed,Typetraits,考虑以下代码: #include <iostream> #include <type_traits> int main(int argc, char* argv[]) { std::cout<<"std::is_same<int, int>::value = "<<std::is_same<int, int>::value<<std::endl; std::cout<<"std::i

考虑以下代码:

#include <iostream>
#include <type_traits>

int main(int argc, char* argv[])
{
    std::cout<<"std::is_same<int, int>::value = "<<std::is_same<int, int>::value<<std::endl;
    std::cout<<"std::is_same<int, signed int>::value = "<<std::is_same<int, signed int>::value<<std::endl;
    std::cout<<"std::is_same<int, unsigned int>::value = "<<std::is_same<int, unsigned int>::value<<std::endl;
    std::cout<<"std::is_same<signed int, int>::value = "<<std::is_same<signed int, int>::value<<std::endl;
    std::cout<<"std::is_same<signed int, signed int>::value = "<<std::is_same<signed int, signed int>::value<<std::endl;
    std::cout<<"std::is_same<signed int, unsigned int>::value = "<<std::is_same<signed int, unsigned int>::value<<std::endl;
    std::cout<<"std::is_same<unsigned int, int>::value = "<<std::is_same<unsigned int, int>::value<<std::endl;
    std::cout<<"std::is_same<unsigned int, signed int>::value = "<<std::is_same<unsigned int, signed int>::value<<std::endl;
    std::cout<<"std::is_same<unsigned int, unsigned int>::value = "<<std::is_same<unsigned int, unsigned int>::value<<std::endl;
    std::cout<<"----"<<std::endl;
    std::cout<<"std::is_same<char, char>::value = "<<std::is_same<char, char>::value<<std::endl;
    std::cout<<"std::is_same<char, signed char>::value = "<<std::is_same<char, signed char>::value<<std::endl;
    std::cout<<"std::is_same<char, unsigned char>::value = "<<std::is_same<char, unsigned char>::value<<std::endl;
    std::cout<<"std::is_same<signed char, char>::value = "<<std::is_same<signed char, char>::value<<std::endl;
    std::cout<<"std::is_same<signed char, signed char>::value = "<<std::is_same<signed char, signed char>::value<<std::endl;
    std::cout<<"std::is_same<signed char, unsigned char>::value = "<<std::is_same<signed char, unsigned char>::value<<std::endl;
    std::cout<<"std::is_same<unsigned char, char>::value = "<<std::is_same<unsigned char, char>::value<<std::endl;
    std::cout<<"std::is_same<unsigned char, signed char>::value = "<<std::is_same<unsigned char, signed char>::value<<std::endl;
    std::cout<<"std::is_same<unsigned char, unsigned char>::value = "<<std::is_same<unsigned char, unsigned char>::value<<std::endl;
    return 0;
}
#包括
#包括
int main(int argc,char*argv[])
{

std::cout这是设计的,说
char
signed char
unsigned char
是不同的类型。我认为可以使用静态转换。

事实上,标准准确地告诉我们char、signed char和unsigned char是3种不同的类型。一个char通常是8位,但这不是由一个8位数字可以编码256个唯一值,区别仅在于如何解释这256个唯一值。如果将8位值视为符号二进制值,它可以表示从-128(编码80h)的整数值。到+127。如果你认为它是无符号的,它可以表示0到255的值。通过C++标准,一个符号char被保证能够保持值127到127(不是-128!),而一个无符号字符能够保持值0到255。 将字符转换为整数时,结果由实现定义!根据单个字符“É”(ISO 8859-1)的机器实现,结果可能是-55或201。事实上,在一个字(16位)中保存字符的CPU可以存储FFC9或00C9或C900,甚至C9FF(以大端和小端表示)。对有符号或无符号字符的显式强制转换可以保证字符到整数的转换结果

有三种不同的基本字符类型:字符、有符号字符和无符号字符。 虽然有三种字符类型,但只有两种表示形式:有符号和无符号。字符(普通)使用其中一种表示形式。其他两种字符表示形式中的哪一种等效于字符,取决于编译器

在无符号类型中,所有位都表示该值。例如,8位无符号字符可以包含从0到255(含0到255)的值

该标准没有定义有符号类型的表示方式,但规定了范围应在正值和负值之间平均划分。因此,8位有符号字符保证能够保存从-127到127的值


那么如何决定使用哪种类型?

使用字符的计算通常会有问题。默认情况下,字符在某些计算机上是有符号的,而在其他计算机上是无符号的。因此,我们不应该在算术表达式中使用(普通)字符。仅将其用于保存字符。如果需要小整数,请显式指定有符号字符或无符号字符


<> P>从C++第五版,66页.< /P> < P>中添加更多关于范围的信息:因为C++ 20,-128值也保证了符号char:

对于有符号整数类型的每个值x,存在对应无符号整数类型的唯一值y,使得x与y模2N全等,反之亦然;每个这样的x和y具有相同的表示形式

[脚注:这也称为。
[示例:有符号类型的值-1与相应无符号类型的值2N-1一致;这些值的表示形式相同。]

表X中规定了每个有符号整数类型的范围指数的实现所需支持的最小值

我善意而痛苦地(因为)重写了下表x:

╔═════════════╦════════════════════════════╗  
║ Type        ║ Minimum range exponent N   ║  
╠═════════════╬════════════════════════════╣  
║ signed char ║        8                   ║  
║ short       ║       16                   ║  
║ int         ║       16                   ║  
║ long        ║       32                   ║  
║ long long   ║       64                   ║  
╚═════════════╩════════════════════════════╝  
因此,有符号字符有8位:-2ⁿ⁻1至2ⁿ⁻1-1(n等于8)

保证的范围是从-128到127。因此,说到范围,char和signed char之间不再有区别


关于卡多伊兹的评论:这是标准所说的,这是现实。
使用以下程序进行现实检查:

#包括
内部主(空){
字符c=-128;
printf(“%d\n”,(int)c);
printf(“%d\n”,int--c);
返回0;
}
输出:

-128
127


我还想说,有符号字符将有助于其他程序员,也可能有助于编译器理解您将使用字符的值来执行指针的算术。

在对字符、有符号字符和无符号字符之间的差异进行了非常详细的回顾(我非常感谢)之后,我想知道:

它打算解决什么问题

C++标准中有什么需要来构建如此复杂的东西

有一个您不确定是否要签名的字符有什么好处

为了逃避这个问题,我想为这样一个疯狂的解决方案提供我的答案:

char是char,它的任务是尽可能地包含一个字符

如果我没有弄错的话,文本字符串(例如const char*,甚至char[])表示UTF-8编码的文本

如果我们将这两个概念结合起来,我们就知道一个字符必须包含UTF-8字符,直到达到允许的程度。而且,正如我们所知,一个字符作为一个单独的UTF-8字符最多可以包含0x00到0x7E范围内的一个代码。在这个范围之外,UTF-8字符由多个字符组成,2、3和4个字符,更简洁。多个字符s、 此表示形式应称为代码点

无论是1、2、3或4个字符,这些代码点都没有符号,事实上,最左边的位用于编码UTF-8代码的头部,并表示它包含多少字节,或者也用于指示字符在完成代码点之前对头部进行补充


归根结底,字符是否有符号并不重要,重要的是在文本字符串的上下文中如何解释字符。

有趣的是,我知道
char
可以有符号或无符号,但我认为它至少相当于其中之一。其他重复的可能重复:,我知道这个帖子是很久以前的,但是这个答案与C++ C++入门的第二章相同。@ JerieWang我做了一个编辑,这是一个有效的C++入门语言。
-128
127