阅读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
?还是仅仅是标准中的缺陷?
答案 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
是解决之道。