¿Cómo imprimir un rango de tipos de datos básicos sin ninguna función de biblioteca y constante en C?

¿Cómo escribir código C para imprimir un rango de tipos de datos básicos como int, char, short int, unsigned int, unsigned char, etc.? 
Se supone que los números con signo se almacenan en forma de complemento a 2. 
Recomendamos encarecidamente minimizar el navegador y probarlo usted mismo primero.

Los siguientes son los pasos a seguir para los tipos de datos sin firmar
1) Encuentre la cantidad de bytes para un tipo de datos dado usando el operador sizeof. 
2) Encuentre el número de bits multiplicando el resultado de sizeof por 8. 
3) El valor mínimo para un tipo sin signo es siempre 0 independientemente del tipo de datos. 
4) El valor máximo de un tipo sin signo es (1 << n) – 1 donde n es el número de bits necesarios en el tipo de datos. Por ejemplo, para char, que normalmente requiere 8 bits, el valor máximo es 255.

Los siguientes son los pasos a seguir para el tipo de datos firmados
1) Encuentre la cantidad de bytes para un tipo de datos dado usando el operador sizeof. 
2) Encuentre el número de bits multiplicando el resultado de sizeof por 8. 
3) El valor mínimo para un tipo con signo es -(1 << (n-1)). Por ejemplo, para char, que normalmente requiere 8 bits, el valor mínimo es -128. 
4) El valor máximo de un tipo de datos es (1 << (n-1)) – 1 donde n es el número de bits necesarios en el tipo de datos. Por ejemplo, para char, que generalmente requiere 8 bits, el valor máximo es 127.
A continuación se muestra el código C para demostrar la idea anterior. 
 

C

// C program to print range of basic data types
#include <stdio.h>
 
// Prints min and max value for a signed type
void printUnsignedRange(size_t bytes)
{
    int bits = 8*bytes;
 
    // Note that the value of 'to' is "(1 << bits) - 1"
    // Writing it in following way doesn't cause overflow
    unsigned int to = ((1 << (bits-1)) - 1) + (1 << (bits-1)) ;
 
    printf(" range is from %u to %u \n", 0, to);
}
 
// Prints min and max value for an unsigned type
void printSignedRange(size_t bytes)
{
   int bits = 8*bytes;
   int from = -(1 << (bits-1));
   int to =  (1 << (bits-1)) - 1;
   printf(" range is from %d to %d\n", from, to);
}
 
int main()
{
    printf("signed char: ");
    printSignedRange(sizeof(char));
 
    printf("unsigned char: ");
    printUnsignedRange(sizeof(unsigned char));
 
    printf("signed int: ");
    printSignedRange(sizeof(int));
 
    printf("unsigned int: ");
    printUnsignedRange(sizeof(unsigned int));
 
    printf("signed short int: ");
    printSignedRange(sizeof(short int));
 
    printf("unsigned short int: ");
    printUnsignedRange(sizeof(unsigned short int));
 
    return 0;
}

C++

#include <iostream>                /*1ULL is used to tell compiler use 1 which is having data type unsigned long long*/
using namespace std;            /*if we use 1 only it will be explained as 1 of data type int which will further */
                                /*give us a wrong output by giving a warning: left shift count >= width of type [-Wshift-count-overflow]*/
int main() {
 
    cout<<"signed char: the range is from "<<(1 << ((sizeof(char)*8)))<<" to "<< ~(1 << ((sizeof(char)*8)-1));
 
    cout<<"\nunsigned char: the range is from "<<0<<" to "<< ~((1 << ((sizeof(char)*8)-1))+(1 << (sizeof(char)*8)));
 
    cout<<"\nsigned int: the range is from "<<(1ULL << ((unsigned long long)(sizeof(int)*8)))<<" to "<< ~(1ULL << ((unsigned long long)(sizeof(int)*8)-1ULL));
 
    cout<<"\nunsigned int: the range is from "<<0<<" to "<< ~((1ULL << ((unsigned long long)(sizeof(int)*8)-1ULL))+(1ULL << (unsigned long long)(sizeof(int)*8)));
    
      cout<<"\nsigned float: the range is from "<<(1ULL << ((unsigned long long)(sizeof(float)*8)))<<" to "<< ~(1ULL << ((unsigned long long)(sizeof(float)*8)-1ULL));
 
    cout<<"\nunsigned float: the range is from "<<0<<" to "<< ~((1ULL << ((unsigned long long)(sizeof(float)*8)-1ULL))+(1ULL << (unsigned long long)(sizeof(float)*8)));
 
      return 0;
}

Producción: 

signed char:  range is from -128 to 127
unsigned char:  range is from 0 to 255
signed int:  range is from -2147483648 to 2147483647
unsigned int:  range is from 0 to 4294967295
signed short int:  range is from -32768 to 32767
unsigned short int:  range is from 0 to 65535

Tenga en cuenta que las funciones anteriores no se pueden utilizar para flotar. Además, es posible que el programa anterior no funcione para tipos de datos más grandes que int, como ‘long long int’. Podemos hacer que funcione para tipos más grandes cambiando el tipo de datos de ‘to’ y ‘from’ a long long int.
Este artículo es una contribución de Abhay Rathi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *