С++ С чем зависит размер 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).

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

Ответ 1

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)).

Ответ 2

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

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

Ответ 3

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