Duda con los Modificadores de tipos de datos de C/C++

Tus experiencias con la informática, o fuera de la informática
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Duda con los Modificadores de tipos de datos de C/C++

Mensaje por Jonny »

Estoy dándole duro a C++, ahora que estoy de vacaciones, empollándome un manual bastante extenso que tengo desde hace tiempo y que siempre me dio pereza acabar de leer, siquiera.

Pensaba que sería de lo que menos me costaría entender, pero veo que no.

En este manual, mencionan los modificadores de tipos de datos muy por encima. Ni explican como funcionan ni nada, solo cuales se aplican a cada tipo de dato y poco más.

Así pues, me he puesto a buscar por Google como funcionan; y sí, algo entiendo. Que un long int por ejemplo, es el doble (aunque en alguno sitios solo pone mayor que) un int, que un short int es inferior (imagino que la mitad) que un int...
pero sin embargo, he visto que short int ocupa 16 bits, mientras que long int, si un int ocupa 32 y long int es el doble... no ocupa 64, sino también 32.
Supongo, que lo que varía de int a long int, es el rango del valor, aunque siga ocupando 32 bits. Pero entonces ¿por qué un short int ocupa 16?.

En cualquier caso, no es que entienda mucho lo de que ocupe 32 bits por ejemplo, y el valor máximo que pueda almacenarse sea 32767 o 32768... (aunque en algunos sitios pone valores muy superiores).

De todas formas esto es un cachondeo, porque en webs como la de zator, dice que el estándar del ANSI C no tiene una regla fija sobre el tamaño de los tipos de datos y sus rangos ;).
y que depende de la plataforma y del procesador.
¿Entonces como haces con C/C++ para usar solo la memoria necesaria, si no sabes ni siquiera cuanto ocupa un int?.

Bueno, sí, con:

Código: Seleccionar todo

sizeof(int);
sabes lo que ocupa un int pero ¿hay que estar comprobando constantemente el tamaño de un int para declarar cualquier variable de ese tipo, y para modificar su tamaño?.

Así, que si todo eso es para gestionar bien la memoria del PC y ahorrar recursos... ¡no se ni por donde empezar con eso!.

¿Alguien que sepa explicármelo?.

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Duda con los Modificadores de tipos de datos de C/C++

Mensaje por Ximorro »

Sí, eso de que los enteros tienen el tamaño de palabra de la CPU ya te lo dije aquí ¿no lo recuerdas?:
http://www.emesn.com/autoitforum/viewto ... tos#p13755

Eso se hizo por eficiencia, pues se trabaja directamente con los enteros de la CPU.

C es un lenguaje de bastante bajo nivel (más cercano a la máquina), no es un ensamblador claro pero tampoco es un lenguaje de alto nivel que oculta las interioridades de la arquitectura.

Ya comenté que el estándar de C tenía ese "problema". Quizás con los nuevos estándares para C++ han definido las cosas de otra manera, investiga a ver.

Y si no la cosa es adaptarse, nosotros lo que hacíamos era definir las variables según lo que necesites, por ejemplo si sólo quieres valores hasta 255 pues usas un unsigned char.
Para usar los "enteros de tamaño variable", o sea, el int normal, pues la cosa es si quieres comprobar el rango numérico con las macros que te decían hasta qué número puedes poner, (INT_MAX y compañía).

Para guardar los datos en estructuras o archivos por ejemplo siempre se hacía lo de calcular el tamaño con sizeof(), es lo más seguro. Creo que sizeof también funciona si quieres serializar objetos.

Por cierto, si tienes un límite de 32767 es que tienes un entero de 16bits con signo. 32767=2^15-1 pues un bit es para el signo, y el cero ocupa un puesto de los positivos (está montado para que no haya 0 y -0, los negativos llegan a -32768=-2^15).
Con 32bits con signo tienes hasta 2147483647.

Sin las macros también puedes comprobar fácilmente los límites. En una variable entera, por ejemplo con signo, haz 32767+1, si da negativo es de 16bits.
En los sistemas actuales no tengo claro si el S.O. engaña al software de los tamaños de palabra, los procesadores son típicamente de 64bits pero si el S.O. está en modo 32bits quizás haga ver a los programas que el sistema hardware es de 32 bits.
Vaya, es fácil, define un int y hazle un sizeof(), te dirá cuántos bytes tienes en un entero.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Duda con los Modificadores de tipos de datos de C/C++

Mensaje por Jonny »

Sí, eso de que los enteros tienen el tamaño de palabra de la CPU ya te lo dije aquí ¿no lo recuerdas?:
Sí, recuerdo el post y lo que explicabas en él ;).

He visto que hay un estándar del año pasado, habría que investigar esto, a ver si lo han montado mejor, pero no se yo...

Todo esto además de por no entender bien el rollo de los modificadores y demás, es porque he estado mirando como compilar un programa escrito en C/C++ para 64 bits, aunque no he encontrado nada.

No tengo ni idea de como se hará, pero me temo que no será tan sencillo como en AutoIt, que eliges si generar el ejecutable para 32 o 64 bits y listo.

Sí, me imagino que será así de sencillo porque AutoIt no compila, empaqueta el código con el intérprete, y posiblemente la diferencia esté en empaquetar con el intérprete de 32 o 64 bits. Y en C/C++, al compilarse realmente el código y trabajar directamente con la memoria y el resto de hardware, pues deba escribirse el código de una forma u otra. Y me huelo que los tipos de datos, su tamaño, rangos etc, ha de tener mucho que ver ¿no?.

Pero no he encontrado ni un compilador para generar ejecutables de 64 bits (porque me supongo, que además de escribir el código de una forma u otra según para la arquitectura que se quiera compilar, la forma de generar el ejecutable no será la misma para una plataforma de 32 que de 64 bits).

Ya puestos:
¿Que sabéis de eso?.

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Duda con los Modificadores de tipos de datos de C/C++

Mensaje por Ximorro »

¿Cómo que no has visto nada para compilar C en 64bits? ¿Pues no usaste Dev-C para lo de la DLL?

Dev-C tiene versiones para 64 y 32bits, de hecho no recomiendan la de 32 porque la de 64 puede compilar en los dos formatos.
Creo que era cosa de especificar un par de cosas, decir que el target era un exe de 32bits y poner el path a las librerías de 32bits.
Pero precisamente para hacer uno de 64bits no hay que hacer nada porque es lo que tiene por defecto.

El código no tiene que escribirse de forma diferente, a menos que estés haciendo cosas muy específicas. Por supuesto los punteros cambian pues las direcciones de memoria son de 64bits en vez de 32, y seguramente el famoso int sea de 64bits, pero no creo que tengas que tener en cuenta esas cosas a la hora de hacer el programa.

En AutoIt efectivamente el intérprete ya está compilado en las dos versiones, lo que hace es añadir el que toca cuando quieres 32 o 64 bits, naturalmente el au3 es igual para los dos.
El intérprete 32bits está en AutoItSC.bin y el de 64 en AutoItSC_x64.bin, el exe que genera AutoIT es básicamente una concatenación del bin correspondiente y el a3x generado desde el au3.
Lo bueno de esto es que puedes compilar perfectamente para 64bits desde un 32bits, aunque luego no lo puedes ejecutar ;-)
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Duda con los Modificadores de tipos de datos de C/C++

Mensaje por Jonny »

mmmm...

pues no se por qué, tenía entendido que Dev-C++ no compilaba más que para 32-bits, aunque por otra parte he visto algo de MinGW para 64 bits, y ese es el compilador que lleva Dev-C++...

Entonces, habrá que investigar como hacer lo que dices en Dev-C++, supongo que eso se especificará en el .dev del proyecto, tendré que investigar los parámetros de los .dev.

La versión que uso de Dev-C++ para compilar las DLL es la 4.9.9.2, no se si con esa se podrá compilar para 64-bits.

Pero entonces, si los punteros efectivamente han de ser de 64 bits ¿hay algún tipo de dato fundamental o derivado de C/C++ para declarar punteros de 64-bits, o de eso se encarga directamente el compilador?.
El int he leído que hay un tipo: el "__int64", pero o es de un estándar más bien nuevo, o es un tipo de dato de algún compilador concreto, como he leído algo por ahí.

Por eso lo de querer entender bien los modificadores, porque creí que con ellos podría definir int's de 64 bits, con algo como "long int" o "long long int".

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Duda con los Modificadores de tipos de datos de C/C++

Mensaje por Ximorro »

Igual estás usando una versión un poco vieja.
Como el desarrollo de Dev-C se paralizó un tipet hizo un fork para seguir con el proyecto, que es el que ahora tiene más fama (por lo que he visto por internet, que no es que yo sea un experto).

Éste:
http://orwellengine.blogspot.com.es/

Y ahí no hay que hacer nada, lo normal es que ya sea 64bits. A menos que bajes expresamente la versión de 32bits, cosa que no recomiendan:
Guide to choose between 32bit and 64bit
The 64bit compiler will also run op 32bit computers. Not problem at all.
The 64bit compiler can do everything the 32bit compiler can, including creating standard 32bit executables.
The 64bit compiler can do stuff the 32bit compiler can't, like creating 64bit executables. It also comes with a lot more headers and libraries.
There is no single reason to download the 32bit version except for maybe file size, marginally longer compiling time, or in case you have to use that specific compiler for any reason (regression problems for example).
Guía para elegir entre 32 y 64bits:
Básicamente dicen que el de 64 hace todo lo que el de 32 y más, puede ser ejecutado en ordenadores 32bits y generar código de 32bits. Pero además, a diferencia de la versión 32bits, lógicamente puede hacer ejecutables de 64bits, incluso desde máquinas 32bits. Y viene con muchas más librerías.
Las únicas ventajas de descargar el 32bits es que ocupa menos y que compila ligeramente más rápido.

No sé por qué te preocupas tanto por los tipos, te creas problemas que no son tales, ponte a hacer programas y verás que no te afecta.
int * es un puntero a entero, y se pone exactamente igual en 32 y 64 bits, internamente serán diferentes tanto el puntero como el tamaño del dato, pero el puntero no te afecta en nada y el dato como mucho con los rangos, si quieres asegurarte de que es de 64bits o más pues usa un long int y ya está, pero deja de preocuparte por ese tema, hombre.
Como te digo empieza a hacer programas y ya verás los problemas reales que te aparecen, seguro que no serán los tamaños de los punteros.

Y bueno, si no puedes con ello pásate a Autoit: no tiene punteros y el tamaño ¡incluso el tipo! de las variables cambia dinámicamente.
Tú preocupándote de si un int es de 64bits y resulta que si en AutoIt haces

Código: Seleccionar todo

$a = 2131
$a es un INT32, si luego haces

Código: Seleccionar todo

$a = $a * $a * $a
entonces automáticamente $a se convierte en un INT64, si luego haces

Código: Seleccionar todo

$a = $a + 0.1
$a se convierte automáticamente en un Double.

¿Y a que nunca te ha importado? Pues en C cambian mucho menos, así que aún te tiene que afectar menos :smt003
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Duda con los Modificadores de tipos de datos de C/C++

Mensaje por Jonny »

¡vaya!. Entonces sería por eso, que no veía nada de compilar en Dev-c++ para 64-bits, voy a ver ese proyecto y descargarlo.
En realidad, que ocupe más o menos, o que tarde un poco más en compilar no me importa.
No sé por qué te preocupas tanto por los tipos, te creas problemas que no son tales, ponte a hacer programas y verás que no te afecta.
Bueno, porque en todas partes hablan mucho de los tipos de datos, de lo importante de ahorrar memoria y carga del procesador, de lo importante de saber usar correctamente los tipos de datos ;).
int * es un puntero a entero, y se pone exactamente igual en 32 y 64 bits, internamente serán diferentes tanto el puntero como el tamaño del dato, pero el puntero no te afecta en nada y el dato como mucho con los rangos, si quieres asegurarte de que es de 64bits o más pues usa un long int y ya está
Vale, vale.. El problema es, que en ningún sitio explican eso y menos así de sencillo.
Entonces claro, cuando sólo lees tipos de datos, bits, etc etc, parece que haya que hacer un código diferente para una arquitectura u otra.

Quizás C sea más flexible de lo que me pienso ;).

Salu2!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Duda con los Modificadores de tipos de datos de C/C++

Mensaje por Jonny »

Ya he bajado la versión portable de la versión de Dev-C++ que comentas.

Todo funciona bien. He cogido un código que tengo y lo he compilado como viene configurado por defecto (x64) y todo perfecto. Pero al cambiar el compilador, por el de 32-bits, al compilar pone no se que, de que algo no es compatible, pero acaba compilando...

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Duda con los Modificadores de tipos de datos de C/C++

Mensaje por Ximorro »

Abajo en la misma página esa del blog pone, para compilar en 32bits:
.- Para proyectos nuevos o compilar sin proyecto ir a Tools >> Compiler Options >> Settings >> Code Generation, y poner "Pointer Width" a 32bit

.- Si ya tienes un proyecto creado es en las opciones del propio proyecto:
Project >> Project Options >> Compiler >> Code Generation, ahí poner lo de "Pointer Width" a 32bit.

ADEMÁS hay que seleccionar las librerías de 32bts:
Tools >> Compiler Options >> Directories >> Libraries. Cambiar el path que termina en 'lib' para que apunte a la carpeta llamada 'lib32'

A ver si te faltaba lo de las librerías...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder