[C con Clase] Preguntas sobre bits y números negativos

Salvador Pozo salvador en conclase.net
Mie Nov 28 23:55:32 CET 2007


El pasado 2007-11-28 22:36:31, David Reza escribió:
 
Hola:

DR> ...
DR> Mi pregunta es qué tan cierto es esto? 

Sí, es cierto. Para codificar números con signo en binario se usa el "complemento a dos".

Esto consiste en dos operaciones. La primera es un "complemento a uno", y la segunda, incrementar el resultado.

Concretando más, un "complemento a uno", o sencillamente, "complemento", consiste en cambiar los unos por ceros y los ceros por unos.

Así, para obtener el código de signo contrario correspondiente a un número en binario cualquiera, primero se complementa cada bit, y después se suma uno.

Por ejemplo, el número 127, que como bien dices es 01111111 en binario, complementado a uno da el código 10000000, y si sumamos uno al resultado, será 10000001.

Este código tiene algunas ventajas, como que los números positivos y negativos mantienen el bit de paridad, es decir, si el último bit es uno, el número es impar, y si es cero, par.

La mayor ventaja es que la suma de dos números de signo contrario siempre da como resultaro cero:
  10000001 
+ 01111111
----------
 100000000

Ya sé que esto no es cero, pero hay que tener en cuenta que sólo tenemos ocho bits, por lo tanto, el de la izquierda no forma parte del código.

DR> Y por qué se supone que el código
DR> ASCII de 8 bits llega hasta el 255?

Si prescindimos del bit de signo, disponemos de ocho bits para codificar números, por lo tanto, los valores posibles están en el ámbito de 0 a 255.

DR> Es por cuestión de que se declare 'con signo' o 'sin signo'?

Efectivamente, y a su vez, esto es así porque los microprocesadores disponen de instrucciones para trabajar con valores enteros con y sin signo. C y C++ tienen muchas características de bajo nivel, y por eso pueden aprovechar estas características de los procesadores.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase