miércoles, 20 de abril de 2022

53 - Todos los tipos de datos primitivos en el lenguaje C


Como hemos estado aprendiendo a programar utilizando el lenguaje C no nos hemos quedado a hilar fino en los tipos de datos primitivos.

Cada vez que necesitamos almacenar un entero utilizamos el tipo int, también dijimos que el tipo char permite almacenar un entero pequeño, pero el lenguaje C permite definir distintos tipos de enteros según la capacidad máxima a almacenar y si necesitamos guardar el signo.





Hay cuatro modificadores de tipo para las variables enteras: signed, unsigned, short y long que nos permiten ampliar los tipos enteros en el lenguaje C.


Variables de tipo entera.

  • char (permite almacenar un valor entero entre -128 y 127 o entre 0 y 255 dependiendo del compilador utilizado)
  • signed char (permite almacenar un valor entero entre [-128 , 127])
  • unsigned char (permite almacenar un valor entero entre [0 , 255])
  • signed short int ( permite almacenar un valor como mínimo entre[-32767 , 32767])
    Cuando definimos una variable de este tipo podemos resumirla poniendo solo short o short int o signed short.
  • unsigned short int ( permite almacenar un valor como mínimo entre[0 , 65535])
    Cuando definimos una variable de este tipo podemos resumirla poniendo solo unsigned short.
  • signed int (permite almacenar un valor como mínimo entre [-2147483648 , 2147483647]
    Cuando definimos una variable de este tipo podemos resumirla poniendo solo int
    Recordemos que hasta ahora siempre utilizamos este tipo de dato para almacenar enteros, pero de ahora en más podemos utilizar la más eficiente según la necesidad de almacenamiento.
  • unsigned int (permite almacenar un valor como mínimo entre [0 , 4294967295]
    Cuando definimos una variable de este tipo podemos resumirla poniendo solo unsigned
  • signed long int (permite almacenar un valor como mínimo entre [-2147483648 , 2147483647]
    Cuando definimos una variable de este tipo podemos resumirla poniendo solo long o long int o signed long
  • unsigned long int (permite almacenar un valor como mínimo entre [0 , 4294967295]
    Cuando definimos una variable de este tipo podemos resumirla poniendo solo unsigned long
  • signed long long int (permite almacenar un valor como mínimo entre [?9223372036854775807 , 9223372036854775807]
    Cuando definimos una variable de este tipo podemos resumirla poniendo solo long long o long long int o signed long long
  • unsigned long long int (permite almacenar un valor como mínimo entre [0 , 18446744073709551615]
    Cuando definimos una variable de este tipo podemos resumirla poniendo solo unsigned long long


Problema 1:

Definir variables de tipo entera, almacenar valores por asignación y mostrar su contenido


Programa: programa182.c

#include<stdio.h>
#include<conio.h>

int main()
{
    signed char c1=65;
    printf("c1 es de tipo signed char:%c \n",c1);
    unsigned char c2=160;
    printf("c2 es de tipo unsigned char:%c \n",c2);
    signed short int e1=32000;
    printf("e1 es de tipo short int:%i \n",e1);
    unsigned short int e2=64000;
    printf("e2 es de tipo unsigned short int:%i \n",e2);
    signed int e3=-2147483648;
    printf("e3 es de tipo signed int:%i \n",e3);
    unsigned int e4=4294967295;
    printf("e4 es de tipo unsigned int:%u \n",e4);
    signed long int e5=-2147483648;
    printf("e5 es de tipo signed long int:%li \n",e5);
    unsigned long int e6=2147483647;
    printf("e6 es de tipo unsigned long int:%lu \n",e6);
    signed long long int e7=-9223372036854775807;
    printf("e7 es de tipo signed long long int:%lli \n",e7);
    unsigned long long int e8=18446744073709551615;
    printf("e8 es de tipo unsigned long long int:%llu \n",e8);
    getch();
    return 0;
}

tipos de datos enteros

Como vemos tenemos que pasar distintos valores luego del caracter % en la función printf.

Si queremos conocer cual es el valor máximo y mínimo para cada uno de los tipos de datos enteros del lenguaje C podemos ejecutar el siguiente programa:


Programa: programa183.c

#include <stdio.h>
#include<conio.h>
#include <limits.h>

int main() {

   printf("El minimo valor para un signed char = %i\n", SCHAR_MIN);
   printf("El maximo valor para un signed char = %i\n", SCHAR_MAX);
   printf("El maximo valor para un unsigned char = %i\n\n", UCHAR_MAX);

   printf("El minimo valor para un signed short int = %i\n", SHRT_MIN);
   printf("El maximo valor para un signed short int = %i\n", SHRT_MAX);
   printf("El maximo valor para un unsigned short int = %i\n\n", USHRT_MAX);

   printf("El minimo valor para un signed int = %i\n", INT_MIN);
   printf("El maximo valor para un signed int = %i\n", INT_MAX);
   printf("El maximo valor para un unsigned int = %u\n\n", UINT_MAX);

   printf("El minimo valor para un signed long int = %li\n", LONG_MIN);
   printf("El maximo valor para un signed long int = %li\n", LONG_MAX);
   printf("El maximo valor para un unsigned long int = %lu\n\n", ULONG_MAX);

   printf("El minimo valor para un signed long long int = %lli\n", LONG_LONG_MIN);
   printf("El maximo valor para un signed long long int = %lli\n", LONG_LONG_MAX);
   printf("El maximo valor para un unsigned long long int = %llu\n\n", ULONG_LONG_MAX);

   getch();
   return 0;
}


El archivo de inclusión limits.h tiene una serie de macros con los valores máximos y mínimos definidos para nuestro compilador.

El resultado de ejecutar este programa con el compilador GCC en la plataforma Windows 10 ofrece los siguientes resultados:

tipos de datos enteros maximos y minimos

Debemos elegir la variable más adecuada según el valor máximo y mínimo a guardar para que nuestro programa sea más eficiente en cuanto a espacio para reservar como el tiempo de procesamiento de dichas variables.

Si queremos saber cuantos bytes se necesitan reservar para cada uno de los tipos de variables podemos ejecutar el programa:


Programa: programa184.c

#include<stdio.h>
#include<conio.h>

int main()
{
    printf("Bytes requeridos para tipo char: %i\n",sizeof(char));
    printf("Bytes requeridos para tipo short int: %i\n",sizeof(short int));
    printf("Bytes requeridos para tipo int: %i\n",sizeof(int));
    printf("Bytes requeridos para tipo lont int: %i\n",sizeof(long int));
    printf("Bytes requeridos para tipo long long int: %i\n",sizeof(long long int));
    getch();
    return 0;
}


El resultado de ejecutar este programa con el compilador GCC en la plataforma Windows 10 ofrece los siguientes resultados:

tamaños en bytes de tipos de datos enteros

Como podemos ver definir una variable de tipo long long int requiere reservar 8 bytes para el almacenamiento del entero.

No dispusimos con el modificador unsigned ya que el tamaño de la variable sigue siendo igual.


Variables de tipo decimal.

Cuando queremos almacenar un valor con parte decimal hemos estado definiendo variables de tipo float.

En el lenguaje C podemos definir variables decimales de tipo:

  • float
  • double
  • long double

Se diferencian en la precisión como almacenan el valor real. La menos precisa es el tipo float, le sigue double y finalmente la más precisa es long double.


Problema 2:

Imprimir cuantos bytes requieren cada uno de los tipos de datos decimales que tiene el lenguaje C.


Programa: programa185.c

#include<stdio.h>
#include<conio.h>

int main()
{
    printf("Bytes requeridos para tipo float: %i\n",sizeof(float));
    printf("Bytes requeridos para tipo double: %i\n",sizeof(double));
    printf("Bytes requeridos para tipo long double: %i\n",sizeof(long double));
    getch();
    return 0;
}


El resultado de ejecutar este programa con el compilador GCC en la plataforma Windows 10 ofrece los siguientes resultados:

tamaños en bytes de tipos de datos decimales: float double y long double

No hay comentarios:

Publicar un comentario