Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


4. Tipos de datos básicos

Hemos hablado de números enteros, de cómo realizar operaciones sencillas y de cómo utilizar variables para reservar espacio y poder trabajar con datos cuyo valor no sabemos de antemano. Empieza a ser el momento de conocer otros tipos de datos y de profundizar en el manejo de los números enteros.

4.1. Tipo de datos entero

4.1.1. Signo de enteros: signed/unsigned

Hasta ahora habíamos manejado números enteros (sin decimales), pero no hemos detallado si esos números son positivos, negativos o si podemos elegirlo nosotros.

Pues es sencillo: si no decimos nada, se da por sentado que el número puede almacenar tanto valores positivos como negativos. Si queremos dejarlo más claro, podemos añadir la palabra "signed" (con signo) antes de "int". Este es uno de los "modificadores" que podemos emplear. Otro modificador es "unsigned" (sin signo), que nos sirve para indicar al compilador que no vamos a querer guardar números negativos, sólo positivos. Vamos a verlo con un ejemplo

/*  ej040101a.c                */
/*  Numeros enteros con y sin  */
/*  sin signo (primera aprox.) */ 
/*  Ejemplo del apartado 4.1.1 */
/*  Curso de C, Nacho Cabanes  */

#include 

int main()
{
    int primerNumero;
    signed int segundoNumero;
    unsigned int tercerNumero;

    primerNumero = -1;
    segundoNumero = -2;
    tercerNumero = 3;
    printf("El primer numero es %d, ", primerNumero);
    printf("el segundo es %d, ", segundoNumero);
    printf("el tercer numero es %d.", tercerNumero);

    return 0;
}

El resultado de este programa es el que podíamos esperar:

El primer numero es -1, el segundo es -2, el tercer numero es 3

Parece fácil... pero no lo es tanto. Siendo puristas, deberíamos usar el formato "%u" para los números "unsigned", y pueden ocurrir cosas desconcertantes si damos valores negativos a un número que hemos dicho que tendrá sólo valores positivos:

/*  ej040101b.c                */
/*  Numeros enteros con y sin  */
/*  sin signo (segunda aprox.) */ 
/*  Ejemplo del apartado 4.1.1 */
/*  Curso de C, Nacho Cabanes  */

#include 

int main()
{
    int n1;
    unsigned int n2;

    n1 = -9;
    n2 = 10;
    
    printf("El primer numero es %d\n", n1);
    printf("el segundo es %u\n", n2);
    
    /* Vamos a hacer cosas peligrosas... */
    n2 = -10;    
    printf("Ahora el segundo es %u\n", n2);
    
    /* Si lo tratamos con entero con signo... */
    printf("Ahora el segundo es %d\n", n2);
    
    /* Y el primero como entero sin signo */
    printf("Y el primero sin signo es %u\n", n1);
    
    return 0;
}

El resultado es

El primer numero es -9
el segundo es 10
Ahora el segundo es 4294967286
Ahora el segundo es -10
Y el primero sin signo es 4294967287

Internamente, un "int" y un "unsigned int" ocupan el mismo espacio (una cantidad de bits que depende del compilador y del sistema operativo, como veremos dentro de poco), pero cuando se van a mostrar en pantalla, esos bits se interpretan de forma distinta según si decimos que se trata de un número entero con signo o que sólo va a almacenar valores positivos. Por eso, deberemos ser cuidadosos, porque algunos de estos errores pueden ser difíciles de rastrear.

Ejercicio propuesto 4.1.1.1: Crea un programa que pida al usuario dos números enteros sin signo y muestre su producto. Comprueba si se comporta correctamente con valores grandes, así como si introduces un valor positivo y otro negativo.