Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 17 Agosto 2014, 15:58 pm



Título: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: NOB2014 en 17 Agosto 2014, 15:58 pm
Hola a todos.-

Bueno simplemente eso, no me queda muy claro si es simplemente para obtener un número mayor o tiene otro significado, recuerdo que en una oportunidad(en este foro) me daba un error por declarar una variable como unsigned, no puedo encontrar el post, por lo tanto hago esta consulta a Uds. que seguramente con tanta práctica y sapiencia me lo podrán aclarar.-

Saludos.
Daniel


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: ivancea96 en 17 Agosto 2014, 16:01 pm
Si va a tomar números negativos, signed. Sino, unsigned.

##Editado##


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: Eternal Idol en 17 Agosto 2014, 16:28 pm
Lo contrario, signed cuando se trabaja con numeros negativos.


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: ivancea96 en 17 Agosto 2014, 16:41 pm
Eso, fallo al escribir xD


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: JorgeEMX en 17 Agosto 2014, 18:02 pm
También depende, como dices, del número de rango de números positivos que vayas a necesitar. Tampoco es muy necesario usar unsigned, aunque no vayas a ocupar números negativos, si el rango de números enteros con signo te basta.


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: NOB2014 en 17 Agosto 2014, 19:49 pm
Hola.
Muchas gracias a los tres por responder, me parecía que el tema daba para un análisis más profundo, evidentemente me equivoque.-
Lo voy a utilizar como Uds. dicen,  si hay certeza o posibilidades de que la variable tenga que alojar valores negativo, utilizar signed, si estoy seguro de que la variable siempre alojara valores positivos, utilizar unsigned.-
No obstante haciendo estas prácticas me encuentro con cosas que parecen incoherente pero ocurren, ¿alguien me las puede explicar.?
 
Código
  1. #include<stdio.h>
  2.  
  3. int main(void){
  4. unsigned int a = -1;
  5. signed int b = -1;
  6.  
  7. printf("\n valor de a = %d\n", a);
  8.  
  9. if (a < 0){
  10. printf("\n Sin signo < 0\n");
  11. }
  12.  
  13. if (b < 0){
  14. printf("\n Con signo < 0\n");
  15. }
  16.  
  17. if (a == b){
  18. printf("\n %d == %d\n", a, b);
  19. printf("\n %ud == %ud\n\n", a, b);
  20. }
  21.  
  22. return 0;
  23. }

Saludos.
Daniel


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: Blaster en 17 Agosto 2014, 20:14 pm
No obstante haciendo estas prácticas me encuentro con cosas que parecen incoherente pero ocurren, ¿alguien me las puede explicar.?

Utilizas el especificador de formato %d esto obliga a la función printf a interpretar el numero como un entero con signo el especificador apropiado para tal caso es %u, al usar este imprimirás el mayor número que se puede representar en un unsigned int menos 1 debido al desbordamiento.    

Saludos


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: NOB2014 en 18 Agosto 2014, 15:30 pm
Hola Blaster.
No logro entender del todo lo que me propones porque yo huso %u con printf, pero no importa por el momento me quedo con la teoría expuesta en el post (mío) anterior, creo que es suficiente.-

Saludos.
Daniel


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: ivancea96 en 18 Agosto 2014, 15:43 pm
Printf interpreta las variables que le pasas según el % que le coloques.
Si pones un unsigned int a -1, se convertirá en 0xFFFFFFFF. Y así es como lo va a interpretar printf.


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: NOB2014 en 18 Agosto 2014, 16:27 pm
Hola Ivancea96.
Bueno al fin me queda del todo claro, no es porque Blaster lo hayas explicado mal, sino es porque de esta manera me cayó la ficha.- 

Saludos.
Daniel


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: rir3760 en 20 Agosto 2014, 05:30 am
Solo para redondear el tema.

Convertir el valor -1 a un tipo entero sin signo es la forma usual de obtener el valor máximo del tipo en cuestión sin tener que recurrir al encabezado <limits.h>. Esto porque cuando un valor con signo se convierte a uno sin signo y el valor esta fuera del rango valido (-1 lo esta) se le suma o resta (dependiendo del caso) MAX + 1 hasta obtener uno valido (-1 + MAX + 1 == MAX).

Otro caso problemático son las conversiones aritméticas (para mas información buscar el tema "Usual arithmetic conversions"), estas definen como debe obtenerse el tipo común en el cual se realizara la operación. Por ejemplo si los operandos de un operador relacional son de tipo signed int y unsigned int entonces el primero se convierte al segundo:
Código
  1. int a;
  2. unsigned b;
  3.  
  4. a = -1;
  5. b =  0;
  6. printf("%d < %u ? %s\n", a, b, a < b ? "Si" : "No"); /* -1 < 0 ? No */

Lo bueno es que la mayoría de los compiladores, al utilizarlos en su modo estricto, advierten sobre ese tipo de operaciones.

Un saludo


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: NOB2014 en 20 Agosto 2014, 19:08 pm
Hola rir.
Gracias por el aporte, hay cosas que o no están en todos los manuales o uno las pasa por alto, gracias que están Uds.

Convertir el valor -1 a un tipo entero sin signo es la forma usual de obtener el valor máximo del tipo en cuestión sin tener que recurrir al encabezado <limits.h>. Esto porque cuando un valor con signo se convierte a uno sin signo y el valor esta fuera del rango valido (-1 lo esta) se le suma o resta (dependiendo del caso) MAX + 1 hasta obtener uno valido (-1 + MAX + 1 == MAX).

Código
  1. #include<stdio.h>
  2.  
  3. int main(void){
  4.     unsigned int a = -1;
  5.  
  6.     printf("\n\n El m%cximo valor soportado por un entero sin signo es...: %u\n\n", 160, a);
  7.  
  8.     return 0;
  9. }

          Saludos.
          Daniel


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: leosansan en 21 Agosto 2014, 01:42 am
Hola rir.
Gracias por el aporte, hay cosas que o no están en todos los manuales o uno las pasa por alto, gracias que están Uds.


No solamente puedes imprimir los valores límites sino que puedes guardarlos en una variable para su uso posterior. Como ejemplo:

Código
  1. ------------------------------------------------------------
  2.  unsigned long long  int a = -1;
  3.  unsigned long long b = a ;
  4. ------------------------------------------------------------

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: Eternal Idol en 21 Agosto 2014, 07:59 am
No solamente puedes imprimir los valores límites sino que puedes guardarlos en una variable para su uso posterior.

En los dos mensajes anteriores al tuyo se hace eso, trata de no romper las reglas todo el tiempo, si se te borra un mensaje es por algo, volver a publicarlo no es una buena idea.

Reglas del subforo:
Si van a responder a un hilo por favor lean atentamente su contenido y comprueben que su aporte no haya sido hecho con anterioridad por otro usuario.


Título: Re: Cuando utilizar signed y cuando unsigned (lenguaje C)
Publicado por: leosansan en 21 Agosto 2014, 14:03 pm
En los dos mensajes anteriores al tuyo se hace eso, trata de no romper las reglas todo el tiempo, si se te borra un mensaje es por algo, volver a publicarlo no es una buena idea.
............................................................

Me pareció que se hacia hincapié en la impresión en lugar de la asignación.

De todas formas si he molestado por reiterativo es que no supe interpretar los dos mensajes anteriores, que para mí iban en el sentido, reitero, de la impresión. Tal vez el de rir3760 sí hacía referencia a la asignación pero tan sólo quise ser más explícito.

Siento las molestias y estaré más al loro.

Un fuerte saludo de León.