阅读C++ 17草案§6.9.1/5:
现在引用C11草案§7.20.1.2/2,这是C库继承的引用:
注意“至少”部分。这意味着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位宽(duh ...),而uint_least16_t
也将为16位宽。在没有16位整数类型的系统上,uint16_t
将不存在,而uint_least16_t
将不存在。对于需要将值存储在以16位表示的范围内的代码,可以使用uint_least16_t
进行移植。对于需要精确存储 16位(很少见)的代码,uint16_t
是解决之道。