¿Qué plataformas tienen algo más que caracteres de 8 bits?
De vez en cuando, alguien en SO señala que char
(también conocido como 'byte') no es necesariamente de 8 bits .
Parece que los 8 bits char
son casi universales. Pensé que para las plataformas convencionales es necesario tener un procesador de 8 bits.char
para garantizar su viabilidad en el mercado.
Tanto ahora como históricamente, ¿qué plataformas utilizan unchar
que no es de 8 bits y por qué se diferenciarían de los 8 bits "normales"?
Al escribir código y pensar en el soporte multiplataforma (por ejemplo, para bibliotecas de uso general), ¿qué tipo de consideración vale la pena dar a las plataformas que no son de 8 bits?char
?
En el pasado me encontré con algunos DSP de Analog Devices que char
son de 16 bits. Supongo que los DSP son una arquitectura de nicho. (Por otra parte, en ese momento el ensamblador codificado a mano superaba fácilmente lo que podían hacer los compiladores de C disponibles, por lo que realmente no obtuve mucha experiencia con C en esa plataforma).
char
También es de 16 bits en los DSP C54x de Texas Instruments, que aparecieron, por ejemplo, en OMAP2. Existen otros DSP con 16 y 32 bits char
. Creo que incluso escuché sobre un DSP de 24 bits, pero no recuerdo qué, así que tal vez lo imaginé.
Otra consideración es que POSIX exige CHAR_BIT == 8
. Entonces, si estás usando POSIX, puedes asumirlo. Si alguien más tarde necesita portar su código a una casi implementación de POSIX, que resulta que tiene las funciones que usa pero en un tamaño diferente char
, es su mala suerte.
Sin embargo, en general, creo que casi siempre es más fácil solucionar el problema que pensar en ello. Sólo tipo CHAR_BIT
. Si desea un tipo exacto de 8 bits, utilice int8_t
. Su código fallará ruidosamente al compilarse en implementaciones que no proporcionan una, en lugar de usar silenciosamente un tamaño que no esperaba. Como mínimo, si me tocara un caso en el que tuviera una buena razón para suponerlo, entonces lo afirmaría.
Al escribir código y pensar en el soporte multiplataforma (por ejemplo, para bibliotecas de uso general), ¿qué tipo de consideración vale la pena dar a las plataformas con caracteres que no sean de 8 bits?
No se trata tanto de que "valga la pena considerar" algo sino de seguir las reglas. En C++, por ejemplo, el estándar dice que todos los bytes tendrán "al menos" 8 bits. Si su código supone que los bytes tienen exactamente 8 bits, está violando el estándar.
Esto puede parecer una tontería ahora: "¡ por supuesto que todos los bytes tienen 8 bits!", te oigo decir. Pero muchas personas muy inteligentes se han basado en suposiciones que no eran garantías, y entonces todo se vino abajo. La historia está repleta de ejemplos de este tipo.
Por ejemplo, la mayoría de los desarrolladores de principios de los 90 asumieron que un retraso particular en el tiempo de la CPU no operativa que tomara un número fijo de ciclos tomaría una cantidad fija de tiempo de reloj, porque la mayoría de las CPU de consumo tenían aproximadamente la misma potencia. Desafortunadamente, las computadoras se volvieron más rápidas muy rápidamente. Esto generó el surgimiento de cajas con botones "Turbo", cuyo propósito, irónicamente, era ralentizar la computadora para que los juegos que usaban la técnica de retardo de tiempo pudieran jugarse a una velocidad razonable.
Un comentarista preguntó en qué parte del estándar dice que char debe tener al menos 8 bits. Está en la sección 5.2.4.2.1 . Esta sección define CHAR_BIT
el número de bits en la entidad direccionable más pequeña y tiene un valor predeterminado de 8. También dice:
Sus valores definidos por la implementación serán iguales o mayores en magnitud (valor absoluto) a los mostrados, con el mismo signo.
Por lo tanto, cualquier número igual a 8 o superior es adecuado para sustituirlo mediante una implementación en CHAR_BIT
.