阅读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是解决之道。

09-13 07:43