Как работает многобайтовый символ '\ 377777'?

Кланг упомянул мне об этой штуке, когда я пробовал различные нестандартные способы найти std::numeric_limits<size_t>::max() для моего allocator::max_size().

Размер выражения кажется ограниченным до 4 байтов, поэтому он очень похож на имплицированный многобайтовый символ, но я не знаю, как именно он работает.

printf("0x%016hhX\n", '\377');     // 0x00000000000000FF
printf("0x%016X  \n", '\3777');    // 0x000000000000FF37
printf("0x%016X  \n", '\37777');   // 0x0000000000FF3737
printf("0x%016X  \n", '\377777');  // 0x00000000FF373737 [-Wfour-char-constants]
printf("0x%016X  \n", '\3777777'); // 0x0000000037373737 [ too long ]
printf("0x%016X  \n", '\3777777'); // 0x0000000037373737 [ too long ]

Строки 2–4 кажутся возвращающими int, но только 4-я строка предупреждает о -Wfour-char-constants при включении -Weveryting. Почему 4-байтовый символ должен предупреждать своего пользователя?

Объясните, пожалуйста, как это работает. Есть ли в нем разговорный или, вероятно, нормативный термин?

godbolt.org/g/7AR9nw

0
0
51
1

Ответы 1

Поведение при использовании более 3 цифр с восьмеричной константой, указанной \ и заключенной в одинарные кавычки, не определяется стандартом C++. (Интересно, что вы можете определять многосимвольные константы, используя более 2 шестнадцатеричных цифр или даже такие обозначения, как 'ab', но значение int, которое вы получаете, определяется как выполнение.)

Обратитесь к документации вашего компилятора, чтобы узнать, как обрабатывать более длинную восьмеричную константу.

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