C11中的字符类型是什么?
在C11中,除了C11中的字符类型是什么?,c,char,C,Char,在C11中,除了char之外,还有什么真正属于“字符类型” 更准确地说,字符类型的特殊例外(例如,任何对象都可以通过字符类型的左值表达式访问-参见C11标准中的§6.5/7),它们适用于哪些具体类型?它们似乎适用于stdint.h中的uint8\u t和int8\u t,但这有保证吗?另一方面,gcc不将uchar.h中的char16\t视为“字符类型”。仅char,signed char和unsigned char1 类型uint8\u t,int8\u t,char16\u t,或形式为in
char
之外,还有什么真正属于“字符类型”
更准确地说,字符类型的特殊例外(例如,任何对象都可以通过字符类型的左值表达式访问-参见C11标准中的§6.5/7),它们适用于哪些具体类型?它们似乎适用于
stdint.h
中的uint8\u t
和int8\u t
,但这有保证吗?另一方面,gcc不将uchar.h
中的char16\t
视为“字符类型”。仅char
,signed char
和unsigned char
1
类型uint8\u t
,int8\u t
,char16\u t
,或形式为intN\u t
或charN\u t
的任何类型,可能是字符类型的同义词,也可能不是
1(引用自:ISO/IEC 9899:201x 6.2.5类型15)
三种类型的字符、有符号字符和无符号字符统称为字符类型。
char
、有符号字符
和无符号字符
是C11中的字符类型。这与C89相同
将int8\u t
(或uint8\u t
)视为字符类型存在许多问题
字符位>8
,则它们可能不存在李>
由于它们(如果存在)类型定义为现有类型,因此在实践中,您可能可以使用
int8_t
或uint8_t
作为字符类型。但是标准并不能保证任何东西,而且当你拥有真正的字符类型时,也没有理由这样对待它们。还有有符号字符
和无符号字符
。请注意,int8_t
和uint8_t
只是现有类型的别名。已经有人认真建议将其作为基础扩展整数类型上的int8_t
和uint8_t
,功能上分别与signed char
和unsigned char
相同,只是它们不算作§6.5/7中的“字符类型”。据我所知,还没有实施这个想法,但我也不知道有什么理由禁止它。(例如,这样做的好处是,您现在可以拥有不别名程序中所有其他指针的字符串指针。)@zwol您的意思是使用std::basic_string
等吗?@下划线_d基本上是的。考虑到所有库函数都希望使用纯char*
和/或std::string
,这将是一个棘手的问题,但这是可以做到的。不过,我怀疑谨慎使用restrict
至少能让你获得90%的好处。如果sizeof(char)==sizeof(int8_t)
那么int8_t
是一种字符类型吗?@wolf revo cats不,这是不能保证的。理论上它可以被定义为扩展整数类型。@2501intN\u t
类型是可选的,不能存在于没有精确的N
-位类型的机器上。由于char
类型必须是机器上最小的可寻址单元,并且必须至少是8位。。。如果计算机支持int8\u t
类型,则它们必须是[[un]signed]char
的别名。还是我遗漏了某个逻辑漏洞?我猜一些异国情调的机器可以提供相同宽度但不同符号或位表示的类型。。。使它们更适合于char
或intN\t
@underline\d中的一种或另一种。2501的要点是,系统可以提供具有相同大小和表示的类型,但“技术上”不同的类型(即采用一种类型的函数的签名将不匹配另一种类型,等等)我以前使用过cstdint
typedefs,但由于您给出的原因,我停止使用并返回到了旧的char
s。这是有道理的,根据给予char
s的特殊津贴正确地说明意图,并防止以后发生潜在事故(在某些外来实现上)。我想问一下,如果确实存在一个实现,其中char
大于一个字节?例如,如果您查看gnulibc的memset,它位于cccc=(unsigned char)c行;cccc |=cccc参见:了解一些示例。是的,那会让glibc崩溃。但是glibc通常使用特定于arch的汇编代码来表示memset、memcpy等。因此,该代码可能不是实际使用的代码。此外,还有一点=8补贴主要针对DSP。但您可以合理地假设在大多数桌面系统上CHAR_位=8,POSIX要求CHAR_位正好是8位。但是,该标准也涵盖了许多其他系统。