C/Visual C - Variables en C

 
Vista:

Variables en C

Publicado por Bio (6 intervenciones) el 03/04/2010 13:28:41
Hola

Tengo este codigo en C y no entiendo por que el valor de todas la variables es el mismo.
Incluso si añado tipo "long int", " long long" me da el mismo resultado, 2147483647, que es el valor maximo de int.

#include <stdio.h>
#include <math.h>

int main(){

int M;
long digitos;
unsigned long x;

digitos=sizeof(digitos)*8;
digitos=pow(2,digitos-1)-1;
M=sizeof(M)*8;
M=pow(2,M-1)-1;
x=sizeof(x)*8;
x=pow(2,x-1)-1;

printf("long=%d \n int=%d \n unsigned long=%d \n",digitos,M,x);

system("PAUSE");
return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Variables en C

Publicado por Tom (619 intervenciones) el 05/04/2010 12:30:17
No te has estudiado el printf ¿eh pillín?

Joé, %d es para "pintar" un int.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Variables en C

Publicado por Bio (6 intervenciones) el 06/04/2010 08:39:28
Hola Tom

Gracias por responder, epro si que los he estudiado y lo que quiero hacer es simplemente, "pintar" el maximo del valor de cada variable.
Basicamente para ver si el programa corre en 32 o 64.
Solo estoy haciendo pruebas por que como ves no tengo mucha idea de C pero si se que solo tengo esto:

c Character a
d or i Signed decimal integer 392
e Scientific notation (mantise/exponent) using e character 3.9265e+2
E Scientific notation (mantise/exponent) using E character 3.9265E+2
f Decimal floating point 392.65
g Use the shorter of %e or %f 392.65
G Use the shorter of %E or %f 392.65
o Signed octal 610
s String of characters sample
u Unsigned decimal integer 7235
x Unsigned hexadecimal integer 7fa
X Unsigned hexadecimal integer (capital letters) 7FA
p Pointer address B800:0000

Lo mas cerca de imprimir el numero maximo contenido en un long o en un long long por ejemplo es usar la notacion cientifica,"long=1.060998E-314", pero asi el usuario no concibe el tamaño de la variable con esa E de por medio.
Otra opcion es pasarlo a caracter pero no se como se hace y otra opcion es dividir el numero en int´s y mostrar todos los int seguidos, pero es un poco engorroso.
¿alguna idea?.

Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Variables en C

Publicado por Tom (619 intervenciones) el 06/04/2010 10:11:04
Sigue leyendo la doc. ¿¿¿ Y los modificadores (h y l, por ejemplo) ???

Por otra parte, aunque parece que usas un compilador de c para window$, puede que tengas disponible un fichero de cabecera "limits.h", en el que estarán ya definidos los valores máximos y mínimos de los tipos numéricos.

Por ejemplo, en linux harías:

#include <limits.h>

main() {
...
...
printf("En este equipo, el valor máximo de un 'unsigned int' es: %u", UINT_MAX);
...
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Variables en C

Publicado por Bio (6 intervenciones) el 06/04/2010 12:49:36
El compilador que uso es para windows y se llama wxDev-C++.

Por otro la do si que dispongo del limits.h y con esa libreria si que me funciona y no me da errores pero no me deja mostrar por ejemplo el Long Long

#define LONG_LONG_MAX 9223372036854775807LL

ni con %ul, %lu,%ll,%ld. nada de nada.
Y es que lo raro es que luego lo usa para x64

#define _I64_MIN LONG_LONG_MIN
#define _I64_MAX LONG_LONG_MAX
#define _UI64_MAX ULONG_LONG_MAX

gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Variables en C

Publicado por Tom (619 intervenciones) el 06/04/2010 14:43:05
Quizás es un poco viejo ese compilador ... yo te recomiendaría mingw ( http://www.mingw.org/ ) aunque sea un poco más lioso.

De todos modos me extraña que %lld y %llu no funcionen.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Variables en C

Publicado por Bio (6 intervenciones) el 07/04/2010 09:24:13
OK, he cambiado a MinGW con el gui code blocks y con este codigo:

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

int main(){

unsigned long x;

x=sizeof(x)*8;
x=pow(2,x-1)-1;

printf("unsigned int=%lu \n",x);
printf("En este equipo, el valor máximo de un 'unsigned long' es: %lu", LLONG_MAX);

return 0;
}

me suelta esto:

unsigned int=-2147483648
En este equipo, el valor mßximo de un 'unsigned int' es: -1
Process returned 0 (0x0) execution time : 0.015 s
Press any key to continue.

con los siguiente errores:
||In function `int main()':|
|11|warning: converting to `long unsigned int' from `double'|
||=== Build finished: 0 errors, 1 warnings ===|
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Variables en C

Publicado por Tom (619 intervenciones) el 07/04/2010 09:57:19
A ver, para, reflexiona y revisa lo que has pegado aquí.

1º x=(unsigned long)(pow(2, x - 1) - 1);

2º printf("En este equipo, el valor máximo de un 'unsigned long' es: %lu", ULONG_MAX);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Variables en C

Publicado por Bio (6 intervenciones) el 07/04/2010 12:14:00
Bueno, creo que es correcto ¿no?

1º x=(unsigned long)(pow(2, x - 1) - 1);

en este punto x deveria valer 32 que es el numero de bites designados a una variable long por lo que el entero mas alto que se puede guardar en 2^31 por que el ultimo lo usa para el signo.
De echo tendria que usar los 32 por que al ser unsigned todos los valores son positivos.
Y luego le resto 1 ya que el primer bit es 1 en decimal y si no lo resto se "pasa de vueltas" y me da el valor negativo mas alto, que es lo que esta pasando (-2147483648).
El valor de un unsigned long en x32 es 4,294,967,295 (2^32) que yo sepa.

2º printf("En este equipo, el valor máximo de un 'unsigned long' es: %lu", ULONG_MAX);

y aqui solo quiero que muestre el valor maximo que se le esta dando como definicion en la libreria limits.h
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Variables en C

Publicado por Bio (6 intervenciones) el 07/04/2010 12:42:05
Creo que empiezo a entender el tema y es que no se pueden mostrar variables de tipo long long (64 bits) y double (128 bits) en maquinas con nucleo x32 por muy definidas que esten estas variables.
Ahora bien, si compilo el programa en x64 seguro que me funcionan tanto las variables long long como las double.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Variables en C

Publicado por Capitan Kirk (97 intervenciones) el 08/04/2010 11:45:50
Las funciones de la familia printf no están preparadas para elementos del tipo long long. Si el compilador soporta este tipo, debería tener funciones similares a printf para ello. Si quieres hacerte una idea, mira el compilador LCC-Win32, este, por ejemplo, utiliza el modificador ll (ele ele) para %d si quieres imprimir enteros de 8 bytes.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Variables en C

Publicado por a (1 intervención) el 08/04/2010 19:04:35
// test.c
// compilado con gcc.
// gcc test.c -o test
// ./test

#include<stdio.h>

int main()
{
unsigned long l;
unsigned long long ll;

printf( "size of unsigned long = %i\n", sizeof( l ));
printf( "size of unsigned long long = %i\n", sizeof( ll ));

l = 4294967295UL;
ll = 18446744073709551615ULL;

printf( "unsigned long = %lu\n", l );
printf( "unsigned long long = %llu\n", ll );

return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar