为什么将char16_t定义为具有与uint_least16_t相同的大小,而不是与uint16_t相同的大小?

时间:2018-06-21 09:55:25

标签: c++ unicode types utf-16

阅读C ++ 17草案§6.9.1/ 5:

  

类型char16_tchar32_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?还是仅仅是标准中的缺陷?

2 个答案:

答案 0 :(得分:4)

这使得在字节大小不是16的因子(例如32位字节或9位字节)的系统上使用char16_t成为可能。这样的系统可以具有uint_least16_t但不能具有uint16_t

答案 1 :(得分:4)

首先,顾名思义,uint_least16_t必须是能够容纳16位的最小大小。在同时具有16位和32位整数的系统上,不能是32位。

第二,uint16_t不需要存在。它仅在具有16位整数类型的系统上存在。当然,这些很普遍,但是C和C ++旨在对它们可以定位的硬件施加最小的约束,并且有些系统没有16位整数类型。

在具有16位整数类型的系统上,uint16_t的宽度为16位(duh ...),而uint_least16_t的宽度也为16位。在没有16位整数类型的系统上,uint16_t将不存在,而uint_least16_t将存在。对于需要将值存储在以16位表示的范围内的代码,使用uint_least16_t是可移植的。对于需要精确存储 16位(很少见)的代码,uint16_t是解决之道。