• Viernes 1 de Agosto de 2014, 13:49

Autor Tema:  ¿Cómo imprimir long con printf?  (Leído 2625 veces)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
¿Cómo imprimir long con printf?
« en: Martes 28 de Diciembre de 2010, 13:53 »
0

Publicidad 
Tengo lo siguiente:

Código: C
  1. #include <stdio.h>
  2. #include <limits.h>
  3.  
  4. int main()
  5. {
  6.     unsigned long ulID = ULONG_MAX;
  7.     unsigned int uInt = UINT_MAX;
  8.  
  9.     printf("Long value: %#lxn", ulID);
  10.     printf("Int value: %#xn", uInt);
  11.  
  12.     return 0;
  13. }
  14.  
pero el resultado que obtengo es el mismo:

Código: Text
  1. Long value: 0xffffffff
  2. Int value: 0xffffffff
  3.  
y si pongo

Código: C
  1. printf("Long value: %#016lxn", ulID);
  2.  
obtengo

Código: Text
  1. Long value: 0x000000ffffffff
  2. Int value: 0xffffffff
  3.  
¿Alguien podría explicarme esto? Gracias  ^_^

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: ¿Cómo imprimir long con printf?
« Respuesta #1 en: Martes 28 de Diciembre de 2010, 21:05 »
0
Esto ocurre debido a que la plataforma que estas utilizando (supongo que es una PC) int y long utilizan la misma cantidad de bytes, en mi caso son 4 bytes, entonces podria decirse que en esta plataforma (PC) int y long son equivalentes, aunque suponer que int y long son equivalentes para cualquier plataforma, seria un error y podria acarrear problemas de portabilidad.

para comprobar cuanto espacio en bytes utilizan los dos tipos, puedes usar lo siguiente:

Código: C++
  1.  
  2.     printf("%dn", sizeof(int));
  3.     printf("%dn", sizeof(long));
  4.  
  5.  

En mi caso esas sentencias me reportaron un valor de 4 bytes para cada tipo, o sea que como dije antes, en mi pc son equivalentes, si usas otra plataforma, quizas los valores sean diferentes ;)

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: ¿Cómo imprimir long con printf?
« Respuesta #2 en: Miércoles 29 de Diciembre de 2010, 11:19 »
0
Efectivamente, tienes razón. Pero ¿quién fue el lumbreras que puso int y long el mismo tamaño? No tiene ni pies ni cabeza, ¿para qué quiero 2 tipos primitivos exactamente iguales?  &lt;_&lt;

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: ¿Cómo imprimir long con printf?
« Respuesta #3 en: Miércoles 29 de Diciembre de 2010, 20:18 »
0
Citar
¿para qué quiero 2 tipos primitivos exactamente iguales?

Bueno, como dije antes, no son iguales en realidad, hay que tomarlos como si fueran diferentes, esto depende del compilador y de la plataforma.

Investigando un poco, el estandar solo especifica que el tipo long no sea menor a int, no hay nada que especifique que forzozamente sea mayor a int, pueden ser iguales.

Haciendo un poco de historia, y suponiendo el porque (piensa un poco en la logica de esto), en sistemas de 16 bits (me viene a la memoria Turbo C) el valor int era de 16 bis, y el long era de 32 bits. Cuando se actualizo a procesadores y sistemas de 32 bits, supongo que se tuvo que ampliar el tipo int a 32 bits, debido a que internamente el procesador usa registros de 32 bits, y es mas eficiente en terminos de velocidad utilizar 32 que 16 bits en un procesador de 32 bits, y el tipo int es el mas utilzado al definir variables que guarden valores enteros, asi que esa seria la razon, la eficiencia, ya que si como programador estas acostumbrado a declarar varlables int, es poco probable que pensaras, "bueno, estoy programando en 32 bits, ahora utilizare long, que es de 32 bits, en lugar de int que es de 16 bits, para que mi programa sea mas eficiente". La fuerza de la costumbre de utilizar int te haria ocupar el tipo int en lugar de long, aun cuando no fuera eficiente (suponiendo claro que lo hubieran dejado en 16 bits)

Quizas entonces debieron ampliar el tipo long para que fuera de 64 bits, pero igual me parece que no lo hicieron por compatibilidad con programas mas antiguos. En todo caso si necesitas un numero mas grande podrias utilizra long long, que en mi caso es de 64 bits (8 bytes).

Es probable tambien que mas adelante, cuando se vuelvan cosa comun los sistemas de 64 bits, haya un cambio parecido, y ahora el tipo int sera de 64 bits, aunque no se, creo que cualquier cosa puede suceder, eso dependera de los que definan los estandars, y tambien de los que diseñen compiladores para los nuevos sistemas ;)

saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================