C++ От чего зависит размер char16_t?

Это также связано с char32_t и любой intXX_t, В спецификации указано, что:

2.14.3.2:

Значение литерала char16_t, содержащего один символ c-char, равно значению его кодовой точки ISO 10646, при условии, что кодовая точка может быть представлена ​​одной 16-битной кодовой единицей.

5.3.3.1:

[..] в частности [..] sizeof(char16_t), sizeof(char32_t) и sizeof(wchar_t) определяются реализацией

Я не вижу ничего о intXX_t типы, кроме комментария, что они являются "необязательными" (18.4.1).

Если char16_t Не гарантировано ли 2 байта, гарантированно 16 бит (даже на архитектурах, где 1 байт!= 8 бит)?

3 ответа

Решение

3.9.1 Фундаментальные типы [basic.fundamental]

Типы char16_t и char32_t обозначают различные типы с тем же размером, подписью и выравниванием, что и uint_least16_t и uint_least32_t, соответственно, в, называемых базовыми типами.

Это означает, что значение char16_t составляет не менее 16 бит (но может быть больше)

Но я также верю:

Значение литерала char16_t, содержащего один символ c-char, равно значению его кодовой точки ISO 10646, при условии, что кодовая точка может быть представлена ​​одной 16-битной кодовой единицей.

предоставляет те же гарантии (хотя и не так явно (как вы должны знать, что ISO 10646 - это UCS (обратите внимание, что UCS совместим, но не совсем то же самое, что Unicode))).

Значение char16_t литерал, содержащий один символ c-char, равен значению его кодовой точки ISO 10646 при условии, что кодовая точка может быть представлена ​​одной 16-битной кодовой единицей.

Это невозможно удовлетворить, если char16_t не менее 16 бит в ширину, поэтому, в отличие от этого, он гарантированно будет таким же широким.

Нельзя гарантировать, что он будет точно 16 битом, поскольку существуют платформы, которые не поддерживают такие маленькие типы (например, DSP часто не могут адресовать что-то меньшее, чем их размер слова, который может быть 24, 32 или 64 бита). Ваша первая цитата гарантирует, что она будет не менее 16 бит.

Другие вопросы по тегам