Триграфы отброшены
Исходные файлы закодированы в физическом наборе символов , который в зависимости от реализации сопоставляется с исходным набором символов , который определен в стандарте. Чтобы приспособить сопоставления из некоторых физических наборов символов, которые изначально не имели всех знаков препинания, необходимых для исходного набора символов, язык определил триграфы - последовательности из трех общих символов, которые можно было использовать вместо менее распространенного символа пунктуации. Для их обработки требовались препроцессор и компилятор.
В C ++ 17 триграфы были удалены. Таким образом, некоторые исходные файлы не будут приняты более новыми компиляторами, если они не будут сначала переведены из физического набора символов в какой-либо другой физический набор символов, который однозначно отображает исходный набор символов. (На практике большинство компиляторов просто сделали интерпретацию триграфов необязательной.) Это не тонкое изменение поведения, а критическое изменение, предотвращающее компиляцию ранее приемлемых исходных файлов без внешнего процесса перевода.
Подробнее ограничения на char
Стандарт также относится к набору символов выполнения , который определяется реализацией, но должен содержать по крайней мере весь исходный набор символов плюс небольшое количество управляющих кодов.
Стандарт C ++ определяет char
как целочисленный тип, возможно, без знака, который может эффективно представлять каждое значение в наборе символов выполнения. Используя представление языкового юриста, вы можете утверждать, что char
должно быть не менее 8 бит.
Если ваша реализация использует беззнаковое значение для char
, то вы знаете, что оно может быть в диапазоне от 0 до 255 и, таким образом, подходит для хранения всех возможных байтовых значений.
Но если ваша реализация использует значение со знаком, у нее есть параметры.
Большинство будет использовать два дополнения, давая char
a минимальный диапазон от -128 до 127. Это 256 уникальных значений.
Но другой вариант - знак + величина, где один бит зарезервирован, чтобы указать, является ли число отрицательным, а остальные семь битов указывают величину. Это даст char
диапазон от -127 до 127, что составляет всего 255 уникальных значений. (Потому что вы теряете одну полезную комбинацию битов для представления -0.)
Я не уверен, что комитет когда-либо явно обозначал это как дефект, но это произошло потому, что вы не могли полагаться на стандарт, чтобы гарантировать при передаче от unsigned char
до char
и обратно исходное значение сохраняется. (На практике все реализации так и поступали, потому что все они использовали дополнение до двух для целочисленных типов со знаком.)
Только недавно (C ++ 17?) Была исправлена формулировка, чтобы гарантировать циклическое переключение. Это исправление, наряду со всеми другими требованиями к char
, фактически требует дополнения до двух для подписанного char
, не говоря об этом явно (даже если стандарт продолжает разрешать представления знак + величина для других целочисленных типов со знаком). Есть предложение потребовать, чтобы все подписанные интегральные типы использовали два дополнения, но я не помню, вошло ли это в C ++ 20.
Так что это своего рода противоположность тому, что вы ищете поскольку он дает ранее неверный чрезмерно самонадеянный код обратного исправления.