Calcular el rango en byte de un determinado objeto sin utilizar <limits.h> [C]

Iniciado por NOB2014, 21 Octubre 2016, 22:52 PM

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

NOB2014

Hola, ¿ cómo están ?
Bueno lo dicho, alguien me puede decir si esto es factible y de serlo, por favor, podrían dar alguna referencia. -
Saludos.
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.-

engel lex

si es unsigned tienes la opción siempre de restarle 1 a un objeto incializado en 0... esto llevará su posición a la maxima...

si es signed sabes que negativo es el inverso de los numeros (1 a 0) cuando el primer bit es 1, entonces solo tienes que hacer desplazamiento de bits hasta que te de un negativo... en ese punto sabes que el negativo fue el bit de mayor orden


tambien puedes en ambos casos hacer desplazamiento de un 1 hasta que vuelva a 0, en ese caso sabes que ese fue el punto de desbordamiento, solo tienes que contar los saltos y la potencia de 2 saltos menos 1 es el limite
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

NOB2014

Hola engel lex
Cita de: engel lex en 22 Octubre 2016, 05:27 AM
tambien puedes en ambos casos hacer desplazamiento de un 1 hasta que vuelva a 0,
en ese caso sabes que ese fue el punto de desbordamiento,
solo tienes que contar los saltos y la potencia de 2 saltos menos 1 es el limite

Sin lugar a dudas es lo busco, pero no logro implementarlo ni siquiera intentarlo, me podrías guiar con un poco de código, si lo deseas gracias y si no igual me sirve como idea. -
Saludos.
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.-

engel lex

no estoy ahorita en un lugar con compilador...

has un codigo con desplazamiento de bits

es decir

TIPO a = 1;
int contador = 1;
while(a!=0){
  a >> 1;
  contador ++
}


"TIPO" es el tipo de variable con la que lo declares

aqui el comportamiento de "a" será algo como

00001
00010
00100
01000
10000
00000 ---> aqui sabes que desbordaste


El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

NOB2014

Dejo lo que hice, pero no me funciona, voy a seguir buscando y si tienes tiempo te agradecería que me digas lo que estoy haciendo mal. -
El igual en la lineal 9 lo puse porque de lo contrario hacia un bucle infinito. -

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char **argv ){
int a = 1;
int contador = 1;

while(a!=0){
a >>= 1;
printf( "\n %d", a );
contador ++;
}

printf( "\n %d \n", contador );

return EXIT_SUCCESS;   
}}

Saludos.
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.-

engel lex

está bien en lineas generales tu codigo, el error fue mio,

lo ecribí
a >> 1;
porque no te estoy dando el codigo, solo una idea... XD

pero si tuve el error en la dirección... igual cuando te den codigos, así sea aquí procura revisar la lógica a antes de ejecutarlo... otra cosa, el contador empieza en 0 no en 1, es un while, no un do-while
el ejemplo interno del ciclo
00001
00010
00100
01000
10000
00000 ---> aqui sabes que desbordaste


el 1 se mueve hacia la izquierda... el desplazamiento lo puse al contrario debe ser <<

con una pequeña correción y quitando la impresión de arriba queda algo como

#include <stdio.h>
#include <stdlib.h>


int main( int argc, char **argv ){
int a = 1;
int contador = 0;

while(a!=0){
a <<= 1;
contador ++;
}

a = 1;
a <<= contador-1;

printf( "\n maximo int positivo %d", a-1 );//si cambias el tipo de a, cambia el tipo de %d al respectivo
printf( "\n minimo int negativo %d", a );
printf( "\n el largo de la variable es de %d bits\n", contador );

return EXIT_SUCCESS;    
}
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

NOB2014

Hola.
Me imagino por lo que escribiste que estas con el seño fruncido así que no voy a pedir el porqué pero en 2 tipos el resultado no me da correcto. -
Voy a practicar y cuando encuentre la solución la posteo para quien la consulte no encuentre errores . -

Un abrazo.
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.-

engel lex

no para nada  ;D mas bien me dio pena no ver el error... para ver en que casos... y como haces el printf (que te dejé una advertencia  ::) allí)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.