• Publicidad

Enteros grandes en C

Todo lo relacionado con lenguajes de programación distintos de Perl: PHP, Java, C++, Ruby, Python, etc.

Enteros grandes en C

Notapor elnico » 2010-06-20 07:32 @355

Hola a todos.

Tengo una pregunta medio básica en C.
Quiero usar una variable de tipo entero sin importar su tamaño pero me encontré con que ¡no puedo ingresar números mayores a 300000!
Este es mi código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using c Syntax Highlighting
  1. #include <stdio.h>
  2. int main(){
  3. int num = 300000;
  4. long num2 = 300000;
  5. printf("Numero: %d",num); //Imprime -27680
  6. printf("Numero2: %d",num2); //Imprime -27680
  7.  
  8. return 0;
  9. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Alguna idea?
Muchas gracias
elnico
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2007-09-09 14:44 @656

Publicidad

Re: Enteros grandes en C

Notapor explorer » 2010-06-20 18:09 @798

Es muy sencillo de entender, si se asistieron a las clases que explicaban la matemática binaria.

El valor de 300.000 lo estás almacenando en dos variables. Una de tipo int y otra de tipo long. Por el resultado, que es el mismo, vemos que tanto una como otra realmente son el mismo tipo: un entero con signo de 32 bits.

¿Cómo es 300.000 en binario?
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
~$> perl -E 'say unpack "B32", pack "N", 300_000'
00000000000001001001001111100000
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Pero... a la hora de imprimir los valores, estás usando %d, que, normalmente, quiere decir que solo queremos imprimir un valor entero de simple precisión. Si estamos en una máquina con 32 bits, eso quiere decir que solo imprimirá un valor de 16 bits.

Si cogemos los 16 bits más bajos del valor anterior, nos queda:
1001001111100000

¿Qué valor es este? El 37.856. Pero el bit superior está puesto a 1, por lo que en realidad es un número negativo (recordemos que estamos con variables con signo). Entonces, en realidad es el 37856 - 65536 = -27680, que es el valor que sale en pantalla. Tu ordenador hace lo que le estás pidiendo :)

Prueba a cambiar %d por %ld, que es la forma de indicar que quieres imprimir valores "largos". Y si no vas a usar números con signo, indícalo también.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Enteros grandes en C

Notapor elnico » 2010-06-21 08:10 @382

Muchas gracias por la explicación, explorer.
Ojalá mi profesor supiera tanto de programación.
elnico
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2007-09-09 14:44 @656


Volver a Programación en general

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados