bien, por lo que la razón detrás de esto ya ha sido contestado, pero en caso de que estaban interesados en algunos antecedentes:
A bit
es la unidad de almacenamiento más pequeña que la computadora puede reconocer (no es el número más pequeño). Un bit es 0
o 1
.
A byte
es un tipo de datos de 8 bits, lo que significa que se compone de cadenas de 8 bits como 10101010
o 0001110
. Usando la combinatoria simple, sabemos que hay 2^8 = 256
combinaciones posibles de bytes.
Si solo quisiéramos representar números positivos, podríamos hacer una conversión directa de la base 2 a la base 10. La forma en que funciona es, para una cadena de bits b7b6b5b4b3b2b1b0
, el número en decimal es dec = sum from n=0 to 7 of (bn * 2^n)
.
Al representar solamente números positivos (un unsigned byte
) podemos representar 256 números posibles en el rango 0
a inclusive.
El problema aparece cuando queremos representar datos firmados. Un enfoque ingenuo (esto es, para fondo, no como lo hace Java) es tomar el bit más a la izquierda y convertirlo en el bit de signo donde 1
es negativo y 0
es positivo. Entonces, por ejemplo, 00010110
sería 21
y 10010110
sería -21
.
Existen dos problemas principales con un sistema de este tipo. La primera es que 00000000
es 0
y 10000000
es -0
, pero como todos saben, no hay -0
que sea diferente de 0
, pero tal sistema permite el número y 0 ≠ -0
. El segundo problema es que, debido a que representa dos ceros, el sistema solo permite representar números de -127
a 127
, un rango de solo 254
(2
menos que antes).
Un sistema mucho mejor (y el que utilizan la mayoría de los sistemas) se llama Two's Compliment. En el cumplido de Two, los números positivos se representan con su cadena de bits normal donde el bit más a la izquierda es 0. Los números negativos se representan con el bit más a la izquierda como un 1 y luego se calcula el cumplido de los dos para ese número (de ahí el nombre)
Aunque matemáticamente es un proceso un poco más complejo, porque estamos tratando con el número 2
hay algunos atajos. Esencialmente, puedes tomar la versión positiva y (de derecha a izquierda) tomar todos los ceros hasta que toques un 1. Copia esos ceros y uno, luego toma el NOT
del resto de los bits. Entonces, por ejemplo, para obtener -21
, positivo 21
es 00010110
tomamos el 10
y no el resto para obtener 11101010
, la representación complementaria de los dos de -21
.Enviar
de Two es un sistema para captar mucho más difícil, pero evita los problemas mencionados anteriormente, y para un número de n bits puede representar todos los dígitos de -2^(n-1)
a 2^(n-1)-1
que por nuestra byte significa -128
a 127
(de ahí el problema en esta pregunta)
Un par de notas:
- Esto es solo para la representación entera. La representación de números reales es otro sistema completo (si hay una solicitud para ello, estoy seguro de que podríamos hacer una representación numérica CW post)
- Wikipedia tiene un par más de sistemas de representación numérica si usted está interesado.
¿Qué quieres decir con que 'parece ser interminable'? – Fermin
@Suresh S: Usted escribió "el byte solo puede contener hasta 127 bits", que de hecho es un montón de bits para un byte ;-). – sleske
@joey oops !! lo siento . –