En this answer y los comentarios adjuntos, Pavel Minaev hace que el siguiente argumento de que, en C, los únicos tipos a los que uint8_t
puede typedef'd son char
y unsigned char
. Estoy mirando this draft del estándar C.¿Puede uint8_t ser un tipo sin carácter?
- La presencia de
uint8_t
implica la presencia de un tipo correspondienteint8_t
(7.18.1p1). int8_t
tiene 8 bits de ancho y no tiene bits de relleno (7.18.1.1p1).- Los tipos correspondientes tienen el mismo ancho (6.2.5p6), por lo que
uint8_t
también tiene 8 bits de ancho. unsigned char
esCHAR_BIT
bits de ancho (5.2.4.2.1p2 y 6.2.6.1p3).CHAR_BIT
es al menos 8 (5.2.4.2.1p1).CHAR_BIT
es como máximo 8, ya sea porqueuint8_t
esunsigned char
, o que es un nounsigned char
, tipo no campo de bits cuya anchura es un múltiplo deCHAR_BIT
(6.2.6.1p4).
Basado en este argumento, de acuerdo en que, si uint8_t
existe, entonces tanto ella como unsigned char
tiene representaciones idénticos: 8 bits de valor y 0 bits de relleno. Eso no parece obligarlos a ser del mismo tipo (por ejemplo, 6.2.5p14).
¿Se permite que uint8_t
se typedef'd a un tipo extendido entero sin signo (6.2.5p6) con la misma representación que unsigned char
? Sin duda debe ser typedef'd (7.18.1.1p2), y no puede ser cualquier tipo de entero estándar sin signo que no sea unsigned char
(o char
si no está firmado). Este tipo extendido hipotético no sería un tipo de carácter (6.2.5p15) y, por lo tanto, no calificaría para el acceso con alias a un objeto de un tipo incompatible (6.5p7), lo cual me parece la razón por la que un compilador quisiera hacerlo. cosa.
una respuesta a su pregunta explícita, pero es posible que CHAR 'es un tipo sin signo, luego' uint8_t' podría ser typedef'ed a 'char' en lugar de' u nsigned char'. –
En un momento (hace varios años) hubo una discusión seria dentro del proyecto GCC de agregar un tipo de entero extendido con exactamente las propiedades que está describiendo --- ocho bits de ancho, no un tipo de carácter, y no siendo un caso especial en tipo basado en alias basado en análisis, pero hasta donde yo sé, nunca fue a ninguna parte, y no hubo ninguna sugerencia de que sea el tipo subyacente para 'uint8_t' (posiblemente porque nadie pensó en eso en ese momento). – zwol
Tenga en cuenta que 'uint8_t' no necesita existir en absoluto. Solo está definido condicionalmente. –