Cuando utilizar signed y cuando unsigned (lenguaje C)

Iniciado por NOB2014, 17 Agosto 2014, 15:58 PM

0 Miembros y 2 Visitantes están viendo este tema.

rir3760

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:
int a;
unsigned b;

a = -1;
b =  0;
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

NOB2014

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.

Cita de: rir3760 en 20 Agosto 2014, 05:30 AM
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).

#include<stdio.h>

int main(void){
     unsigned int a = -1;

     printf("\n\n El m%cximo valor soportado por un entero sin signo es...: %u\n\n", 160, a);

     return 0;
}


          Saludos.
          Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

leosansan

#12
Cita de: 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.


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

Código (cpp) [Seleccionar]
------------------------------------------------------------
 unsigned long long  int a = -1;
 unsigned long long b = a ;
------------------------------------------------------------


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



Eternal Idol

Cita de: leosansan en 21 Agosto 2014, 01:42 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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

leosansan

#14
Cita de: Eternal Idol en 21 Agosto 2014, 07:59 AM
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.