Programación General > C/C++
Complementos(1 y 2)
Leber:
Hola, que tal.
Leyendo un libro, me surgió una duda que no logro aclarar por mas que lo leo.
He leido que en una variable de 8 bits(1 byte), usando un complemento a 2, el rango oscila de -128 a 127, mientras que usando complemento a 1, va de -127 a 127.
Estamos hablando de variables con signo claro.
He mirado el archivo limits.h:
--- Código: C ---# define CHAR_BIT 8 /* Minimum and maximum values a `signed char' can hold. */# define SCHAR_MIN (-128)# define SCHAR_MAX 127
Así que supongo que usan complemento a 2.
Pero no logro ver porque usando complemento a 2, el numero negativo es -128, mientras que usando 1 es -127.
Por lo que he leido, el C2(complemento 2) es igual a: C1+1, pero no se si va por ahi la cosa. Estoy bastante liado la verdad.
Este es el enlace que estoy leyendo, y que de ahí surgió la duda: http://users.powernet.co.uk/eton/kandr2/krx304.html
No se si me he explicado bien, llevo todo el dia con esto y tengo la cabeza muy espesa ya.
Gracias de antemano
punteroNULO:
En este enlace hay una explicación sencilla, y bastante buena, del cálculo del complemento a dos.
http://es.wikipedia.org/wiki/Complemento_a_dos
Leber:
Hola punteroNulo,
Si, lo he leído como 4 o 5 veces xD, pero no me acabo de aclarar.
Es decir, se que el complemento a 2 se usa para representar los números negativos, invirtiendo los bits después de encontrar el primero 1 a la derecha, o usando el complemento a 1 y sumando 1 luego. Esto lo tengo claro, o creo tenerlo vaya.
Creo entender que en complemento a 2, los números negativos van de -128 a 127(siempre hablando de 1 byte claro), y en cambio en complemento a 1 van de -127 a 127 porque en C1 los números negativos son 2^n-1, mientras que en C2 es 2^n.
De todos modos, lo unico que no acabo de cazar muy bien es el hecho de cuando usar uno u otro, y además, ¿por qué en C se usa C2 ?.
Tal y como dije, en limits.h:
Aparece CHAR_MIN como -128.
Quizá es una duda muy tonta, pero no lo se ver, y también se que esta duda no esta muy relacionada con este ámbito, ya que no pregunto dudas especificas de programación, pero no se me ha ocurrido un lugar más apropiado. Aunque si lo creéis oportuno moved el hilo a otro sitio y disculpad las molestias.
Saludos
Epa:
Buenas
El complemento a 1 de un numero se logra invirtiendo todos los bits del numero, o sea (en caso de 8 bits) seria como hacer un N XOR 11111111.
Mientras que el complemento a 2 es el complemento a 1 más 1, o sea (N XOR 11111111) + 00000001
El complemento a 2 se empezo a usar ya que ne el complemento a 1 existe una doble represenacion del 0, ( +0 = 00000000 y -0 = 11111111)
Por eso es que en complemento a 2 el rango va de -128 a 127, en vez de -127 a 127. Ya que C2 no existe esa doble representacion del 0.
Uno no puede elegir si trabajar con un complemento u otro, es como trabaja internamente el procesador
Espero haber podido dejarte todo un poco mas claro.
Saludos
Leber:
Epa, gracias por responder.
Ahora más o menos empiezo a tener una idea bastante clara.
Debido a que en el complemento a 1, existe la doble representación del cero, el rango seria: {-127...-1, -0, 0, 1..., 127}
Mientras en el C2, solo existe una sola representación del cero, tenemos espacio para un byte mas, es decir un numero más, que en este caso es el -128. ¿Es correcto?
EDITO, así no creo una respuesta nueva:
Haciendo unas pruebas sobre lo leído, imaginemos que quiero encontrar el valor en binario del -9.
El 9 en binario es: 1001
Uso el C2:
--- Código: C ----Torno todos sus bits: 0110- Le sumo 1: 0111
Y le agrego un 1 al bit mas significativo, quedando que:
--- Código: ASM ---10111 -> -9
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
Navegación
[#] Página Siguiente
Ir a la versión completa