Trígrafos caídos
Los archivos de origen se codifican en un juego de caracteres físicos que se asigna de una manera definida por la implementación al juego de caracteres de origen , que se define en el estándar. Para adaptarse a las asignaciones de algunos conjuntos de caracteres físicos que no tenían de forma nativa toda la puntuación necesaria para el conjunto de caracteres de origen, el idioma definió trígrafos: secuencias de tres caracteres comunes que podrían usarse en lugar de un carácter de puntuación menos común. El preprocesador y el compilador debían manejarlos.
En C ++ 17, se eliminaron los trígrafos. Por lo tanto, algunos compiladores más nuevos no aceptarán algunos archivos de origen a menos que primero se traduzcan del juego de caracteres físicos a otro juego de caracteres físicos que se asigne uno a uno al juego de caracteres de origen. (En la práctica, la mayoría de los compiladores simplemente hacen que la interpretación de los trígrafos sea opcional). Este no es un cambio de comportamiento sutil, sino un cambio importante que evita que los archivos fuente previamente aceptables se compilen sin un proceso de traducción externo.
Más restricciones en char
El estándar también se refiere al juego de caracteres de ejecución , que está definido por la implementación, pero debe contener al menos todo el juego de caracteres fuente más un pequeño número de códigos de control.
El estándar C ++ definido char
como un tipo integral posiblemente sin signo que puede representar eficientemente cada valor en el juego de caracteres de ejecución. Con la representación de un abogado de idiomas, puede argumentar que char
a debe tener al menos 8 bits.
Si su implementación usa un valor sin firmar para char
, entonces sabe que puede oscilar entre 0 y 255 y, por lo tanto, es adecuado para almacenar todos los valores de bytes posibles.
Pero si su implementación usa un valor firmado, tiene opciones.
La mayoría usaría el complemento a dos, dando char
un rango mínimo de -128 a 127. Eso es 256 valores únicos.
Pero otra opción fue signo + magnitud, donde se reserva un bit para indicar si el número es negativo y los otros siete bits indican la magnitud. Eso daría char
un rango de -127 a 127, que son solo 255 valores únicos. (Porque pierde una combinación de bits útil para representar -0).
No estoy seguro de la comisión nunca explícitamente designado esto como un defecto, pero era porque no se podía confiar en la norma para garantizar un ida y vuelta desde unsigned char
a char
ida y vuelta preservaría el valor original. (En la práctica, todas las implementaciones lo hicieron porque todas usaron el complemento a dos para los tipos integrales firmados).
Solo recientemente (¿C ++ 17?) Se corrigió la redacción para garantizar la ida y vuelta. Esa solución, junto con todos los demás requisitos char
, exige efectivamente el complemento a dos para firmado char
sin decirlo explícitamente (incluso cuando el estándar continúa permitiendo representaciones de signo + magnitud para otros tipos integrales firmados). Hay una propuesta para requerir que todos los tipos integrales firmados usen el complemento de dos, pero no recuerdo si llegó a C ++ 20.
Entonces, este es algo opuesto a lo que está buscando porque le da una corrección retroactiva a un código demasiado presuntuoso que anteriormente era incorrecto .