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