【问题标题】:What counts as character type in C11?C11 中的字符类型是什么?
【发布时间】:2016-08-08 08:34:11
【问题描述】:

除了char,C11 中的“字符类型”实际上属于什么?

更准确地说,字符类型的特殊例外(例如,any 对象可以通过字符类型的左值表达式访问 - 请参阅 C11 标准中的 §6.5/7),以它们适用于哪些具体类型?他们似乎stdint.h 申请uint8_tint8_t,但这有保证吗?另一方面,gcc 不会将 uchar.h 中的 char16_t 视为“字符类型”。

【问题讨论】:

  • 还有signed charunsigned char
  • 请注意,int8_tuint8_t 只是现有类型的别名。
  • 已经有严肃的提议将int8_tuint8_t 建立在扩展整数类型上,在功能上分别与signed charunsigned char 相同除了他们不会算作 §6.5/7 的“字符类型”。据我所知,没有实现过这个想法,但我也不知道有任何理由禁止它。 (例如,这样做的好处是,您现在可以拥有 没有 为程序中所有其他指针起别名的字符串指针。)
  • @zwol 你的意思是使用std::basic_string<uint8_t>等吗?
  • @underscore_d 基本上是的。由于所有库函数都需要纯 char* 和/或 std::string,这会很尴尬,但可以做到。不过,我怀疑谨慎使用 restrict 至少可以获得 90% 的收益。

标签: c char


【解决方案1】:

charsigned charunsigned char1

uint8_tint8_tchar16_t 类型或intN_tcharN_t 形式中的任何类型可能是也可能不是字符类型的同义词。


1(引自:ISO/IEC 9899:201x 6.2.5 Types 15)
char、signed char、unsigned char这三种类型统称为字符类型。

【讨论】:

  • 如果sizeof(char) == sizeof(int8_t) 那么int8_t 字符类型?
  • @wolf-revo-cats 不,不能保证。理论上可以将其定义为扩展整数类型。
  • @2501 intN_t 类型是可选的,不能存在于没有完全 N 位类型的机器上。由于char 类型必须是机器上最小的可寻址单元,并且必须至少为 8 位……如果机器支持int8_t 类型,那么它们必须是[[un]signed] char 的别名。还是我错过了某个地方的逻辑漏洞?我猜一些奇异的机器可以提供具有相同宽度但不同标志或位表示的类型......使它们更适合charintN_t 中的一个或另一个。
  • @underscore_d 2501 的观点是,系统可以提供具有相同大小和表示但“技术上”不同类型的类型(因为采用一种类型的函数的签名不会与另一种匹配等)
【解决方案2】:

charsigned charunsigned char 是 C11 中的字符类型。自 C89 以来也是如此。

int8_t(或uint8_t)视为字符类型有很多问题。

  1. 它们是可选的。
  2. 如果CHAR_BIT > 8,它们可能不存在。
  3. 如果实现使用 2 的补码 表示(这是最常见的),则定义为可以工作。但它们是其他表示形式,即 C 标准定义/允许的 1 的补码sign-magnitude

由于它们(如果存在)被定义为现有类型,因此您可能可以在实践中使用int8_tuint8_t 作为字符类型。但是该标准并不能保证任何事情,并且当您拥有 real 字符类型时,也没有理由将它们视为这样。

【讨论】:

  • 我以前使用过cstdint typedefs,但由于你给出的原因,我停下来又回到了旧的chars。这是有道理的,根据给予chars 的特殊津贴适当地陈述意图,并防止以后发生潜在事故(在一些异国情调的实施中)。
  • 我想问一下,如果真的存在一个实现,char 大于一个字节?例如,如果您在cccc = (unsigned char) c; cccc |= cccc << 8; cccc |= cccc << 16; 行查看 GNU libc 的 memset,如果char 大于一个字节,这个 中断。所以 GNU 似乎隐含地保证 char 是一个字节大。
  • 请参阅:What platforms have something other than 8-bit char? 获取一些示例。是的,那会破坏 glibc。但是 glibc 通常为 memset、memcpy 等使用特定于架构的汇编代码。因此,该代码可能不是实际使用的代码。此外,CHAR_BIT!=8 余量主要针对 DSP。但是您可以合理地假设在大多数桌面系统上 CHAR_BIT=8 并且 POSIX 要求 CHAR_BIT 正好是 8 位。但是,该标准也涵盖了许多其他系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 2015-05-11
  • 2013-03-08
  • 2012-09-13
相关资源
最近更新 更多