3.4.3. Especificadores

Los especificadores modifican el significado de los tipos predefinidos básicos y los expanden a un conjunto más grande. Hay cuatro especificadores: long, short, signed y unsigned.

long y short modifican los valores máximos y mínimos que un tipo de datos puede almacenar. Un int plano debe tener al menos el tamaño de un short. La jerarquía de tamaños para tipos enteros es: short int, int, long int. Todos pueden ser del mismo tamaño, siempre y cuando satisfagan los requisitos de mínimo/máximo. En una maquina con una palabra de 64 bits, por defecto, todos los tipos de datos podrían ser de 64 bits.

La jerarquía de tamaño para los números en coma flotante es: float, double y long double. «long float» no es un tipo válido. No hay números en coma flotantes de tamaño short.

Los especificadores signed y unsigned indican al compilador cómo utilizar el bit del signo con los tipos enteros y los caracteres (los números de coma flotante siempre contienen un signo). Un número unsigned no guarda el valor del signo y por eso tiene un bit extra disponible, de modo que puede guardar el doble de números positivos que pueden guardarse en un número signed. signed se supone por defecto y sólo es necesario con char, char puede ser o no por defecto un signed. Especificando signed char, se está forzando el uso del bit del signo.

El siguiente ejemplo muestra el tamaño de los tipos de datos en bytes utilizando el operador sizeof, descripto más adelante en ese capítulo:

//: C03:Specify.cpp
// Demonstrates the use of specifiers
#include <iostream>
using namespace std;

int main() {
  char c;
  unsigned char cu;
  int i;
  unsigned int iu;
  short int is;
  short iis; // Same as short int
  unsigned short int isu;
  unsigned short iisu;
  long int il;
  long iil;  // Same as long int
  unsigned long int ilu;
  unsigned long iilu;
  float f;
  double d;
  long double ld;
  cout 
    << "\n char= " << sizeof(c)
    << "\n unsigned char = " << sizeof(cu)
    << "\n int = " << sizeof(i)
    << "\n unsigned int = " << sizeof(iu)
    << "\n short = " << sizeof(is)
    << "\n unsigned short = " << sizeof(isu)
    << "\n long = " << sizeof(il) 
    << "\n unsigned long = " << sizeof(ilu)
    << "\n float = " << sizeof(f)
    << "\n double = " << sizeof(d)
    << "\n long double = " << sizeof(ld) 
    << endl;
} ///:~

Listado 3.12. C03/Specify.cpp


Tenga en cuenta que es probable que los resultados que se consiguen ejecutando este programa sean diferentes de una maquina/sistema operativo/compilador a otro, ya que (como se mencionaba anteriormente) lo único que ha de ser consistente es que cada tipo diferente almacene los valores mínimos y máximos especificados en el Estándar.

Cuando se modifica un int con short o long, la palabra reservada int es opcional, como se muestra a continuación.