C++ C+中不同字符类型的使用+;

C++ C+中不同字符类型的使用+;,c++,char,C++,Char,wchar\u t类型保证足够大,可以容纳机器最大扩展字符集中的任何字符。那么为什么需要有符号字符和无符号字符?此外,如果在实践中确实有理由使用后两种方法,有人能提供一些小例子,说明何时使用有符号字符vs无符号字符?我问最后一个问题的原因是,在某些机器上,char是signed,而在其他机器上是unsigned。char没有默认限定符。C++底漆声明当使用 char < /代码>时,应该明确使用哪种版本。我想知道为什么我们在C++的基本字符集中用字符0—255表示“符号char > .< /p

wchar\u t
类型保证足够大,可以容纳机器最大扩展字符集中的任何字符。那么为什么需要
有符号字符
无符号字符
?此外,如果在实践中确实有理由使用后两种方法,有人能提供一些小例子,说明何时使用
有符号字符
vs
无符号字符
?我问最后一个问题的原因是,在某些机器上,
char
signed
,而在其他机器上是
unsigned
char
没有默认限定符。C++底漆声明当使用<代码> char < /代码>时,应该明确使用哪种版本。我想知道为什么我们在C++的基本字符集中用字符0—255表示“<代码>符号char <代码> > .< /p> 。根据C语言和C++语言标准的定义,类型<代码> char <代码>是平台上内存的最小可寻址单元。(注意:某些编译器和平台可能对此进行了扩展。)

因此,为了将一小部分内存作为有符号整数进行寻址,通常使用
signed char
类型。您还可以看到
int8\t
也被使用。要以无符号整数形式访问内存,通常使用
无符号字符
类型


还要注意,
char
的定义,无论是有符号的、无符号的还是普通的,都依赖于编译器 char 是平台上内存的最小可寻址单元。(注意:某些编译器和平台可能对此进行了扩展。)

因此,为了将一小部分内存作为有符号整数进行寻址,通常使用
signed char
类型。您还可以看到
int8\t
也被使用。要以无符号整数形式访问内存,通常使用
无符号字符
类型

还要注意,
char
的定义,无论是有符号的、无符号的还是普通的,都依赖于编译器

虽然“
wchar\u t
[足够]大,可以容纳机器最大扩展字符集中的任何字符”,但我们可能知道我们没有存储任何“扩展”字符,也不希望浪费内存,通过使用比需要的更大的类型来减慢文本处理速度

signed char
unsigned char
分别用作-128..127和0..255范围内整数值的存储,因此当您需要这样一个数字并关心内存使用时可以使用它们,或者最好使用
int8_t
uint8_t
或类似的值,它们的优点和缺点是,暗示类型是
[u]int16/32/64\u t
类型的一个相对较短的形式:如果您存储一个数字,这在概念上更清晰,但是由于
int8\u t
等都是typedef,您可能会发现您的数字与
char
的重载进行了不必要的匹配-例如,
my\u int\u 8=65;std::cout虽然“
wchar\u t
[足够]大,可以容纳机器最大扩展字符集中的任何字符”,但我们可能知道我们没有存储任何“扩展”字符,也不希望使用比需要的更大的类型来浪费内存和减慢文本处理速度


signed char
unsigned char
分别用作-128..127和0..255范围内整数值的存储,因此当您需要这样一个数字并关心内存使用时可以使用它们,或者最好使用
int8_t
uint8_t
或类似的值,它们的优点和缺点是,暗示类型是
[u]int16/32/64\u t
类型的一个相对较短的形式:如果您存储一个数字,这在概念上更清晰,但是由于
int8\u t
等都是typedef,您可能会发现您的数字与
char
的重载进行了不必要的匹配-例如,
my\u int\u 8=65;有几个原因。首先是空间效率:
wchar\u t
s占用的空间超过了ASCII字符所需的空间(在windows上是两倍,在linux上是四倍),这对单个值没有多大影响,但对数组更为重要。每个字符都与最大Unicode值一样大的字符串编码称为UTF-32,顺便说一句,由于这个问题,UTF-32没有被广泛使用。有关更智能的编码,请参阅Wikipedia关于UTF-8的文章

第二个问题是,
char
经常被用作字节可寻址内存的缩写。在这种情况下,如果您不只是直接复制它们,您真的应该指定它的符号,或者使用
(u)int8\t
或类似的东西

至于为什么标准中没有指定有符号的
/
无符号的
,这主要是一个兼容性问题。无论以哪种方式指定它都会破坏某人的旧代码,而我们不能这样做,即使从长远来看这会使事情变得更好。不管怎样,ASCII可以适应0-127,这可能就是为什么这不是一个更大的问题


请注意,您不应该使用
char
来存储实际用户可见的字符,以免让非西方用户非常不高兴
wchar\u t
实际上也不正确,至少在windows上是这样;它对于大多数Unicode都足够大,但不是所有的Unicode都足够大。

有几个原因。首先是空间效率:
wchar\u t
s占用的空间超过了ASCII字符所需的空间(在windows上是两倍,在linux上是四倍),这对单个值没有多大影响,但对数组更为重要。每个字符都与最大Unicode值一样大的字符串编码称为UTF-32,顺便说一句,由于这个问题,UTF-32没有被广泛使用。有关更智能的编码,请参阅Wikipedia关于UTF-8的文章

第二个问题是,
char
经常被用作字节可寻址内存的缩写。在这种情况下,您确实应该指定它的签名,
void f(char c) {}
void f(signed char c) {}
void f(unsigned char c) {}
template <typename T> void f(T c) {}
void f(char c) {}
void f(unsigned char c) {}

typedef signed int MyIntType;

int test()
{
    MyIntType i = 5;
    // This f() call will call the template function not the char overload!
    f(i);
    return 0;
}