Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C11中的字符类型是什么?_C_Char - Fatal编程技术网

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

在C11中,除了
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
    ,则它们可能不存在
  • 定义为在实现使用2的补码表示(这是最常见的)时工作。但它们是其他表示法,即C标准定义/允许的1的补码和符号大小

  • 由于它们(如果存在)类型定义为现有类型,因此在实践中,您可能可以使用
    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不,这是不能保证的。理论上它可以被定义为扩展整数类型。@2501
    intN\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位。但是,该标准也涵盖了许多其他系统。