La principal pregunta se ha respondido varias veces: la palabra clave unsigned
sólo se puede utilizar como un tipo especificador para un tipo integral.
En cuanto a por qué unsigned
es una palabra clave separada, en lugar de tener, por ejemplo, una palabra clave uint
, las razones para eso son históricas.
Las primeras versiones de C (pre-K & R) tenía sólo cuatro tipos fundamentales:
char
(8 bits de, firmado, de complemento a 2)
int
(16 bits, firmado, 2 de -complement)
float
(32 bits)
double
(64 bits, mismo rango que float
pero mayor precisión)
Nota lo que falta: no hay signed
o unsigned
palabras clave, sin short
, long
o long double
; todos esos fueron agregados más tarde. (Los programadores que necesitaban apuntadores aritméticos comúnmente utilizados, que eran libremente intercambiables con int
.)
Cada tipo fundamental tenía un nombre que era una sola palabra clave, lo que hacía que la gramática fuera directa.
Cuando se añadieron otros tipos más tarde, tenía sentido para agregar especificadores como unsigned
, short
y long
a los nombres de los tipos existentes en vez de introducir nuevas palabras clave (que podría haber roto el código existente). Cuando el comité de ANSI C estandarizó el lenguaje en 1989, tuvieron que hacer una estructura coherente a partir de las definiciones existentes no formales, sin dejar de ser coherente con las implementaciones existentes. El resultado es lo que tenemos ahora, donde int long unsigned long
es un nombre de tipo válido (más comúnmente escrito como unsigned long long
).
Si el lenguaje se estaba diseñando desde cero ahora, sospecho que se habría tomado un enfoque diferente. Tal vez habría una única palabra clave para cada tipo fundamental (es el enfoque adoptado por C#, por ejemplo), o tal vez los nombres de tipos fundamentales usarían un esquema más coherente en lugar de un revoltijo de palabras clave (por ejemplo, int:2
para un byte de 2 bytes). entero, unsigned:4
para un entero sin signo de 4 bytes). Pero tanto C como C++ están estancados con el enfoque actual.
Referencia: http://cm.bell-labs.com/cm/cs/who/dmr/cman.pdf
A menos que se refiera a usar 'unsigned' por sí mismo (equivalente a' unsigned int'), no puedo pensar en ningún otro * extraño * caso de uso. –
El título de esta pregunta y la última ... pregunta en el texto son bastante diferentes. ¿Cuál es? – Jon
Siempre he deseado poder usar 'unsigned' con una clase' bigint'. –