Programación General > C/C++

 Complementos(1 y 2)

<< < (2/3) > >>

ProfesorX:

--- Citar ---Sin embargo, usando conversores web para verificarlo, veo que 10111 da 23.

Esto creo que es porque he limitado el numero de bits a 5, pero si lo hiciera con 8, el numero 23 quedaría: 00010111, y el numero -9 en lugar de 0, 1. Voy muy desviado?

Se que el tema se ha desvirtuado mucho, y que poco cabe aquí, lo siento.  :unsure:
 
Gracias y saludos
--- Fin de la cita ---

Desafortunadamente si, vas muy desviado.

Para empezar, tanto en el complemento a uno como en el complemento a 2, se deben rellenar TODOS los bits no utilizados con cero, dependiendo del tamaño en que los vas a almacenar, quiere decir que suponiendo que almacenas el numero nueve de tu ejemplo en una variable de 8 bits (un byte) el numero 9 en realidad es 00001001, y por lo tanto su complemento a uno es 11110110, y el complemento a 2 es 1110111. Si la variable fuera de 16 bits (2 bytes), el numero seria 0000000000001001, el complemento a uno seria 1111111111110110 y el complemento a 2 seria 1111111111110111.

Ahora, segundo error que tienes, recuerda cuando se utiliza el complemento a 1 y 2, el primer digito indica que el numero es un numero NEGATIVO, no un numero positivo, suponiendo que el numero esta en complemento a 2, 10111 es negativo, ya que su primer digito es uno.

Para obtener el verdadero numero que representa, debes volver a calcular el complemento a 2 del numero en cuestion.

Complemento a 1 de 10111: 01000
Sumandole uno para obtener el complemento a 2: 01001
01001 = 9 y como el primer digito del numero era 1, quiere decir que el numero en realidad es -9

Recapitulando, solo se calcula el complemento a 2, si el primer digito es uno, porque eso significa que el numero es negativo, si el primer digito del numero es cero, no se calcula el complemento, porque quiere decir que el numero es positivo. Recuerda ademas que debes rellenar con ceros hasta tener el total de bits de la variable antes de calcular el complemento, si es que quieres obtener el equivalente negativo de determinado numero.

Ahora otro detalle mas para finalizar, y ya aplicado a lenguaje C/C++, el complemento a 2 solo aplica para aquellas variables que utilizan numeros negativos, o sea las variables (signed) short, int, long int, etc. Recuerda que el complemento a 2 es la manera que tenemos los humanos de poder almacenar y representar un numero negativo en la computadora. En las variables que son unsigned, el primer digito no representa nada, y el numero se toma tal cual.

Saludos :)

Leber:
ProfesorX, gracias por tu tiempo.

Por lo que tengo entendido, tanto el complemento a 1 y a 2, ambos solo se usan para buscar y representar números negativos.
Y lo de rellenar con 0's o 1's, me guie por esto que encontre:

" En realidad, un número en complemento a dos se expresa con una cantidad arbitraria de unos a la izquierda, de la misma manera que un número binario positivo se expresa con una cantidad arbitraria de ceros."

Fuente: http://es.wikipedia.org/wiki/Complemento_a_dos

Quizá simplemente lo he interpretado mal.


Sobre esto que diceS:


--- Citar ---Ahora, segundo error que tienes, recuerda cuando se utiliza el complemento a 1 y 2, el primer digito indica que el numero es un numero NEGATIVO, no un numero positivo, suponiendo que el numero esta en complemento a 2, 10111 es negativo, ya que su primer digito es uno.
--- Fin de la cita ---

Uhm, si por ejemplo yo presentara el numero 10111 a alguien, y no le dijera si esta en complemento 1 o 2, uno tiende a pensar que es un numero binario sin mas, el 23.
Ahora, si yo lo presento como: 00010111, o como 11110111, entonces sabrá por el 1 o 0 del principio si se trata de un número negativo, o un numero positivo. Es correcto?

Algo que pensaba que tenia claro, pero viendo esto

--- Citar ---Recapitulando, solo se calcula el complemento a 2, si el primer digito es uno
--- Fin de la cita ---
se me tambalea un poco. El complemento a 2  se usa para encontrar el negativo de un numero positivo en binario, no?
Entonces, si quiero encontrar el numero en binario que representa el -9, tengo que hacer el complemento a 2 del 9, que es lo que hice en el anterior post. Esto es así, o me lo he inventado?

Respecto a lo de C, todo empezó por eso, porque vi un ejercicio donde hablaban sobre esto, y me di cuenta de que yo no tenía ni idea respecto al tema, así que me puse a investigar.
Creo que puse el enlace al principio pero viniendo a resumir, diciendo que no se puede representar en complemento a dos el numero negativo más grande en su valor absoluto. Como CHAR_MIN = -128, no se podría representar el +128.  Y a partir de ahí fui leyendo a poco, pero no se, me cuesta un poco xD

Gracias chicos  ^_^

Epa:
Cre que se va a clarando la cosa, pero todavia hay algo en lo que estas confundido :P

Nosotros cotidianamente usamos el sistema decimal,y para los numeros negativos usamos el signo - adelante del numero.
Los numeros binarios no son mas que numeros en base 2. Si escribis un numero en papel, o se te ocurre empezas a usar el sistema binario, un numero negativo se representa de la misma manera que ne el decimal, con un - adelante. Por ejemplo 22 = 10110(2) y -22 = -10110(2)

El tema del complemento es unicamente para los controladores o procesadores. Como solo funcionan con 0's y 1's se busco la forma de representar el  signo -

Por otro lado, si una pc usa un complemento u otro no es algo que realmente deberia preocuparte como programador. (aunque es bueno saber como funcionan las cosas).

Saludos

ProfesorX:

--- Cita de: "Leber" ---Quizá simplemente lo he interpretado mal.

--- Fin de la cita ---

Si, me parece que si lo habias interpretado mal.

Es correcto lo que dice wikipedia, el numero de bits que uno elige es arbitrario. Tu puedes elegir representar el numero que quieras con 5, 10 20, 30, 40 bits etc., los que tu desees, aunque ya en la practica los numeros solo pueden estar representados con 8, 16 32 y actualmente hasta 64 bits (multiplos de 8, ya que se toma un byte, 8 bits, como medida). Esto depende de la capacidad del procesador. A mayor cantidad de bits, mayor es el numero que puedes representar. Esta es la razon por la que los primeros procesadores solo podian representar un rango maximo de 0 a  255 para numeros sin signo, -128 a 127 si el numero es con signo, y los actuales de 64 bits el rango va de 0 a 18446744073709551616 sin signo,
-9223372036854775808 a 9223372036854775807 si el numero es con signo.


--- Citar ---Uhm, si por ejemplo yo presentara el numero 10111 a alguien, y no le dijera si esta en complemento 1 o 2, uno tiende a pensar que es un numero binario sin mas, el 23.
Ahora, si yo lo presento como: 00010111, o como 11110111, entonces sabrá por el 1 o 0 del principio si se trata de un número negativo, o un numero positivo. Es correcto?

--- Fin de la cita ---

De nuevo y como te dije antes, esto depende de cuantos bits estas eligiendo para almacenar el numero, y de si quieres representar numeros con signo o sin signo. Si en tu ejemplo, utilizas solo 5 bits, el rango que puedes representar es de 0 a 32 sin signo, y de -16 a 15 con signo. Por lo tanto y como ya notaste, y si no lo notaste te lo recalco, 10111 representa 2 numeros, el 23 si eliges numeros sin signo, y -9 s eliges numeros con signo. Entonces 11110111 tambien representa 2 numeros, -9 (de nuevo, pero ahora con 8 bits) si eliges numeros con signo, y 247 si eliges numeros sin signo. En aquellos numeros cuyo primer bit es cero, como podras notar, el numero es el mismo para numeros con o sin signo.


--- Citar ---Algo que pensaba que tenia claro, pero viendo esto

--- Citar ---Recapitulando, solo se calcula el complemento a 2, si el primer digito es uno
--- Fin de la cita ---
se me tambalea un poco. El complemento a 2  se usa para encontrar el negativo de un numero positivo en binario, no?

--- Fin de la cita ---

Exacto, pero recuerda, solo es una forma de representar el numero negativo que quieras. Pero al final, no te compliques tanto, ya que el compilador hace la conversion por ti, no debes preocuparte por convertir el numero negativo que quieras a complemento a 2. Esto te seria util solamente si trabajas con ensamblador o lenguaje maquina.

Saludos :)

Leber:
Gracias, creo que me ha quedado algo más claro, a medida de ir leyendo en webs, y las explicaciones aquí expuestas.

Era solo por curiosidad de saber como funcionan las cosas ^_^

Saludos!

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa