【发布时间】:2018-11-30 14:44:04
【问题描述】:
阅读 C++17 草案 §6.9.1/5:
类型
char16_t和char32_t分别表示与<cstdint>中的uint_least16_t和uint_least32_t具有相同大小、符号和对齐方式的不同类型,称为基础类型。
现在参考 C11 草案 §7.20.1.2/2,这是 C 库继承的参考:
typedef 名称
uint_leastN_t指定一个宽度至少为 N 的无符号整数类型,这样任何具有较小大小的无符号整数类型都至少具有指定的宽度。因此,uint_least16_t表示宽度至少为 16 位的无符号整数类型。
注意“至少”部分。这意味着 char16_t 实际上可能有例如32 位,使char16_t 的数组成为 UTF-16 原始数据的错误表示。在这种情况下,将这样的数组写入二进制文件会导致有效的代码单元与 U+0000 个字符交替出现。
是否有充分的理由将char16_t 定义为uint_least16_t 而不是uint16_t?还是仅仅是标准的缺陷?
【问题讨论】:
-
@PanagiotisKanavos 与
char16_t的大小无关 -
Here's an example 其中
uint_least16_t将使用 18 位。 -
@GiacomoCatenazzi 见上面 Bo Persson 的评论。坦率地说,当前的过时对于 C 或 C++ 标准无关紧要。注意例如他们在指定二进制补码行为而不强制执行实际二进制补码时遇到的麻烦。
-
@PanagiotisKanavos
char16_t不必包含 UTF-16 字符。它只必须包含一个 UTF-16 代码单元,它始终是 16 位。 -
@GiacomoCatenazzi 不同意您的“C 不是为了对所有 CPU 通用而创建的”。如果您所暗示的情况正好相反,那么它将以比现在更简单的措辞指定更多的细节。甚至没有指定字节/
char的大小这一事实完全使该语句无效。