Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: lucaslopez0000 en 16 Diciembre 2012, 21:18 PM

Título: tipos de enteros en C
Publicado por: lucaslopez0000 en 16 Diciembre 2012, 21:18 PM
Buenas a todos , queria realizar lo siguiente , que ahora explico.
Imaginemos que pongo int x; , esto reservaria 32 bits para guardar un numero entero.
¿ puedo decirle al compilador que quiero un entero de X bytes ?
algo así:
int x size tamañoenbytes;
¿ Es posible o estoy diciendo aberraciones ?
Muchas gracias
Título: Re: tipos de enteros en C
Publicado por: twins en 16 Diciembre 2012, 21:36 PM
La memoria es asignada segun el complilador por ejemplo para int algunos reservan 2 bytes y otros reservan 4 bytes, lamentablemente no hay mucho que hacer a lo que tu deseas
Título: Re: tipos de enteros en C
Publicado por: avesudra en 16 Diciembre 2012, 21:40 PM
Si que  hay mucho que hacer twins , para lo que quieres puedes hacer uso de esta fantástica librería:

The GNU Multiple Precision Arithmetic Library  (http://gmplib.org/)
Título: Re: tipos de enteros en C
Publicado por: lucaslopez0000 en 16 Diciembre 2012, 22:07 PM
Muchas gracias , pero ya conocia GNU arbitrary precision ...
Lo que quiero no son las operaciones ( que se como hacerlas ) sino definir un tipo de dato estilo int pero de 128 bits , por ejemplo.
En cuanto a la primera respuesta acaba de pasar x mi cabeza la idea de buscar el codigo fuente del gcc y modificarlo
para que al compilar coja los int como de 128 bits  :)
Título: Re: tipos de enteros en C
Publicado por: avesudra en 16 Diciembre 2012, 22:14 PM
¡Pero es que no vas a poder trabajar con el! Eso de modificar el código de GCC es una locura más que nada porque tendrías que programar las operaciones para trabajar con 128 bits(y eso conlleva reinventar la rueda). Ya que te recuerdo que los procesadores trabajan con 8,16,32 y 64 bits nativamente. Si no te importa responder ¿porqué ese interés en usar un entero de 128 bits y no usar gmp?
Título: Re: tipos de enteros en C
Publicado por: 0xDani en 17 Diciembre 2012, 16:05 PM
Quiza con bitfields puedas hacer algo.

Saludos.
Título: Re: tipos de enteros en C
Publicado por: lucaslopez0000 en 17 Diciembre 2012, 18:42 PM
Espero que no me comais , pero no tengo pc personal y voy al del ciber , que como todos , tienen el podrido winbugs . Solo 1 dia a la semana puedo tener acceso a un pc con linux , y al del ciber no le hace mucha gracia que le toque la BIOS :(
Además , aunque winbugs sea horrible , me gustaria ver si existe un modo de decirle al pc que los mismos algoritmos que usa para operar con enteros de 32 / 64 bits los use con cualquier longitud.
Tambien probé a usar struct para crear un entero de 128 bits , pero el compilador no me permite crear int de tanto tamaño ni siquiera con struct.
No se si será cosa del podrido dev c++ ( con lo bonito que era en linux con gedit y gcc  :-( ) o del propio lenguaje C , aunque por motivos de portabilidad ya se podrian haber creado un tipo de dato que se adapte al valor que le metas ¿ eso existe ?
Imaginate que hago esto:
 
      tipo_flexible blabla;
      blabla = 9;
      // como 9 en binario es 1001 , harian falta 4 bits para representarlo ...
      blabla = 130;
      // como 130 en binario es 10000010 , harian falta 8 bits , y la variable
     // automaticamente coGJeria ese tamaño en bytes ...

En definitiva : ¿ Existe algun tipo de variable que cambie su tamaño a medida que se requiera mas espacio ?

Me da la impresion de que vuelvo a decir aberraciones de índole variada  :P

Gracias por responder :)
Título: Re: tipos de enteros en C
Publicado por: naderST en 17 Diciembre 2012, 18:51 PM
Lo más "sencillo" que puedes hacer es crear tu tipo abstracto de datos que te permita tener un dato de 128 bits y crear el conjunto de operaciones que te permitan operar sobre este tipo de dato.
Título: Re: tipos de enteros en C
Publicado por: 0xDani en 17 Diciembre 2012, 21:31 PM
Mira este articulo sobre bitfields, tienen sus ventajas e inconvenientes, piensalo y quizas consigas una aproximacion a tu tipo flexible.

http://www.linuxforu.com/2012/01/joy-of-programming-understanding-bit-fields-c/
Título: Re: tipos de enteros en C
Publicado por: rir3760 en 18 Diciembre 2012, 02:44 AM
Cita de: lucaslopez0000 en 17 Diciembre 2012, 18:42 PMEspero que no me comais , pero no tengo pc personal y voy al del ciber , que como todos , tienen el podrido winbugs. [...] No se si será cosa del podrido dev c++ ( con lo bonito que era en linux con gedit y gcc  :-( )
No quiero sonar grosero y tampoco es mi intención iniciar una flamewar pero me parece que te estas dejando llevar por el prejuicio. Si consideramos que los compiladores utilizados con Dev-C++ son versiones de gcc para MS Windows (MinGW y CygMing) no veo como pueda existir tal diferencia a menos (y de nuevo) que sea debido a una cuestión de percepción.

Cita de: lucaslopez0000 en 17 Diciembre 2012, 18:42 PMEn definitiva : ¿ Existe algun tipo de variable que cambie su tamaño a medida que se requiera mas espacio ?
No. En C el tamaño de los tipos esta dado en bytes. Siguiendo tu ejemplo los valores 9 y 130 son de tipo int y utilizan un espacio igual a "sizeof(int)", cualquier operación entre ellos (aritmética, a nivel de bits, etc.) siempre se realiza como mínimo con ese tipo.

Como ya te comentaron si requieres de soporte para números realmente grandes fuera del rango del tipo "long" (C90) o "long long" (C99) la solución es una biblioteca de terceros.

Un saludo
Título: Re: tipos de enteros en C
Publicado por: lucaslopez0000 en 19 Diciembre 2012, 21:11 PM
Cita de: rir3760 en 18 Diciembre 2012, 02:44 AM
No quiero sonar grosero y tampoco es mi intención iniciar una flamewar pero me parece que te estas dejando llevar por el prejuicio. Si consideramos que los compiladores utilizados con Dev-C++ son versiones de gcc para MS Windows (MinGW y CygMing) no veo como pueda existir tal diferencia a menos (y de nuevo) que sea debido a una cuestión de percepción.
No. En C el tamaño de los tipos esta dado en bytes. Siguiendo tu ejemplo los valores 9 y 130 son de tipo int y utilizan un espacio igual a "sizeof(int)", cualquier operación entre ellos (aritmética, a nivel de bits, etc.) siempre se realiza como mínimo con ese tipo.

Como ya te comentaron si requieres de soporte para números realmente grandes fuera del rango del tipo "long" (C90) o "long long" (C99) la solución es una biblioteca de terceros.

Un saludo

No son prejuicios , y yo ya sabia que mingw esta basado en gcc , me refiero a la interfaz de uso del programa , un poco liosa encontrarle las opciones .
el compilador es bueno ( derivado de gcc ) , pero el IDE es poco intuitivo ( a mi parecer )
Es que yo soy muy arcaico  ;D y uso gedit y gcc desde la terminal ¿ problem ?
Título: Re: tipos de enteros en C
Publicado por: rir3760 en 20 Diciembre 2012, 02:24 AM
Cita de: lucaslopez0000 en 19 Diciembre 2012, 21:11 PMme refiero a la interfaz de uso del programa , un poco liosa encontrarle las opciones .
el compilador es bueno ( derivado de gcc ) , pero el IDE es poco intuitivo ( a mi parecer )
Un principiante en C o C++ para crear un proyecto en Dev-C++ solo tiene que utilizar las opciones de menú para Nuevo proyecto, aplicación de consola, etc. Otra opción es utilizar el administrador de archivos para crear el archivo con extensión .c o cpp (dependiendo del caso) y, si no se han modificado el manejo de extensiones, doble clic y con ello se abre el archivo en Dev-C++.

Una vez editado el código fuente para compilar y ejecutar se seleccionan las opciones de menú Ejecutar --> Compilar y Ejecutar --> Ejecutar.

Mi punto es, a Dev-C++ se le puede criticar por sus limitaciones y falta de actualizaciones pero decir que no es intuitivo me parece difícil de argumentar.


Cita de: lucaslopez0000 en 19 Diciembre 2012, 21:11 PMEs que yo soy muy arcaico  ;D y uso gedit y gcc desde la terminal ¿ problem ?
En ese caso me extraña que, en estos momentos y en MS Windows, no utilices un editor de texto para programadores (Emacs, XEmacs, gVim, SciTE, etc.) y un entorno similar a Linux (por ejemplo Cygwin). Mas cerca de Linux no se puede y, con un poco de suerte, asunto solucionado.

Un saludo