¿Qué plataformas tienen algo más que caracteres de 8 bits?

Resuelto Craig McQueen asked hace 14 años • 14 respuestas

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 charson 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 charson 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).

Craig McQueen avatar Jan 20 '10 07:01 Craig McQueen
Aceptado

charTambié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.

Steve Jessop avatar Jan 20 '2010 01:01 Steve Jessop

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_BITel 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.

John Feminella avatar Jan 20 '2010 00:01 John Feminella