Rus*_*lan 3 c++ unicode types utf-16
阅读 C++17 草案 §6.9.1/5:
类型
char16_t和char32_t分别表示不同类型的具有相同的大小,符号性,和对准如uint_least16_t和uint_least32_t,分别在<cstdint>被称为底层类型。
现在参考 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?或者它只是标准中的一个缺陷?
首先,顾名思义,uint_least16_t要求是可以容纳 16 位的最小尺寸。在同时具有 16 位和 32 位整数的系统上,它不能是 32 位。
第二,uint16_t不需要存在。它只存在于具有 16 位整数类型的系统上。当然,这些很常见,但是 C 和 C++ 旨在对它们可以定位的硬件施加最小的限制,并且有些系统没有 16 位整数类型。
在具有 16 位整数类型的系统上,uint16_t将是 16 位宽(废话...),并且uint_least16_t也将是 16 位宽。在没有 16 位整数类型的系统上,uint16_t不会存在,并且uint_least16_t会存在。对于需要在可以 16 位表示的范围内存储值的代码, usinguint_least16_t是可移植的。对于需要精确存储16 位(很少见)的代码,这是uint16_t要走的路。
| 归档时间: |
|
| 查看次数: |
547 次 |
| 最近记录: |