2011-10-12 7 views
6

Cada vez que he usado la palabra clave unsigned ha estado antes de int, u otro tipo incorporado. Me preguntaba si podría haber otras formas en que se pueda usar unsigned.¿Se puede usar la palabra clave unsigned de manera no obvia?

  • CAN El equipo de tipos definidos (clases/estructuras) utilizan la palabra clave unsigned?
  • ¿Pueden las plantillas hacer un uso especial con unsigned?

Si no, ¿por qué tiene su propia palabra clave? ¿Por qué unsigned int no es uint?

+0

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

+0

El título de esta pregunta y la última ... pregunta en el texto son bastante diferentes. ¿Cuál es? – Jon

+1

Siempre he deseado poder usar 'unsigned' con una clase' bigint'. –

Respuesta

4

No, no se puede usar con clases o estructuras, ya que no son tipos integrales. Todo lo que una plantilla puede hacer con él es hacer un int sin firmar. Creo que se eligió como palabra clave separada, ya que se puede aplicar a cualquier tipo de entero (char, int, long, long long), logrando con una palabra clave lo que habría requerido cuatro más. Su significado también es inmediatamente evidente, mientras que uint, uchar, etc. no son necesariamente. Y tenga en cuenta que también puede usarse por sí mismo sin un calificador, en cuyo caso se asume que no se firma int.

+0

numérico es incorrecto, en realidad debería tener dichos tipos integrales. –

+0

Más exactamente, tipos integrales incorporados. BigInt es un tipo integral. –

+0

@ 0A0D: Técnicamente, sí, pero utilicé la palabra 'numérica' específicamente para resaltar el hecho de que solo los tipos numéricos pueden tener la calidad de un signo. –

2

No unsigned no es realmente una palabra clave en sí mismo; es solo un modificador para int, short, char.

El unsigned palabra clave puede utilizarse como un modificador para int, short, char, o long. También se puede usar solo como un nombre de tipo; unsigned significa unsigned int.

Se hizo de esa manera para evitar tener tres palabras clave adicionales uint ushort uchar y porque firmó/no firmó podría no haber sido diferente en todas las computadoras tempranas a las que apuntaban C y Unix.

+0

bueno, en realidad es un 'type-specifier' not' modifier'. Ver 7.1.5 en el estándar C++ ISO. –

+0

Vea este [enlace] (http://en.cppreference.com/w/cpp/keywords/unsigned) – COD3BOY

+1

@Sanjay: No me importa lo que diga, vaya a leer el estándar ISO en 7.1.5. http://www-d0.fnal.gov/~dladams/cxx_standard.pdf –

3

unsigned es una palabra clave. unsigned solo se puede usar en integral tipos. unsigned o signed se considera un especificador de tipo, un simple especificador de tipo. Entonces especifican que el tipo será firmado o sin firmar.

Puede typedef las palabras unsigned int a uint pero entonces tendría que hacer que parezca un tipo cuando int es el tipo y unsigned es el tipo especificador per se.

Puede utilizar unsigned por sí mismo, contrariamente a la creencia popular, como se evidencia en la Sección C++ estándar ISO 7.1.5.2 Tabla 7:

enter image description here

Se pueden utilizar varios tipos especificadores (cuando sólo se permite) y se puede mezclar libremente con especificadores de decl en cualquier orden.

También puede hacer esto:

int unsigned i; 

y esto es válido C++.

1

Las palabras clave signed, unsigned, short y long son modificadores de tipo/especificador y cuando se utiliza uno de estos modificadores/especificador de tipo, se supone un tipo de datos de int.

Tan firmado y sin firmar también puede ser used as standalone type specifiers, lo que significa lo mismo que firm int y unsigned int respectivamente. Los siguientes dos declaraciones son equivalentes:

unsigned abc; 

unsigned int abc; 
5

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

0

Existe también unsigned char. Algunos compiladores, como el g ++ de GNU, le permiten colocar unsigned y asumir que quiere decir unsigned int. Por ejemplo, el siguiente código es equivalente

unsigned int x; 

unsigned x; 
Cuestiones relacionadas