Comencemos resumiendo los tipos de datos primitivos de Java:
byte : el tipo de datos Byte es un entero de complemento a dos con signo de 8 bits .
Corto : el tipo de datos corto es un entero de complemento a dos con signo de 16 bits .
int: el tipo de datos Int es un entero de complemento a dos con signo de 32 bits .
long: el tipo de datos Long es un entero de complemento a dos con signo de 64 bits .
float: el tipo de datos Float es un punto flotante IEEE 754 de 32 bits de precisión simple .
double : el tipo de datos doble es un punto flotante IEEE 754 de 64 bits de doble precisión .
booleano: el tipo de datos booleano representa un bit de información .
char: el tipo de datos char es un solo carácter Unicode de 16 bits .
Fuente
Complemento a dos
"El buen ejemplo de wiki es que la relación con el complemento a dos se realiza al observar que 256 = 255 + 1, y (255 - x) es el complemento a uno de x
0000 0111 = 7 el complemento a dos es 1111 1001 = -7
la forma en que funciona es que el MSB (el bit más significativo) recibe un valor negativo, por lo que en el caso anterior
-7 = 1001 = -8 + 0+ 0+ 1
Los enteros positivos generalmente se almacenan como números binarios simples (1 es 1, 10 es 2, 11 es 3 y así sucesivamente).
Los enteros negativos se almacenan como el complemento a dos de su valor absoluto. El complemento a dos de un número positivo es cuando se usa esta notación como un número negativo.
Fuente
Como recibí algunos puntos por esta respuesta, decidí agregarle más información.
Una respuesta más detallada:
Entre otros, hay cuatro enfoques principales para representar números positivos y negativos en binario, a saber:
- Magnitud firmada
- Complemento de uno
- Complemento de dos
- Parcialidad
1. Magnitud firmada
Utiliza el bit más significativo para representar el signo, los bits restantes se utilizan para representar el valor absoluto. Donde 0 representa un número positivo y 1 representa un número negativo , ejemplo:
1011 = -3
0011 = +3
Esta representación es más sencilla. Sin embargo, no puede agregar números binarios de la misma manera que agrega números decimales, lo que dificulta la implementación a nivel de hardware. Además, este enfoque utiliza dos patrones binarios para representar 0, 100 ... 0 y 0 .... 0.
2. Complemento de uno
En esta representación, invertimos todos los bits de un número dado para averiguar su complementario. Por ejemplo:
010 = 2, so -2 = 101 (inverting all bits).
El problema de esta representación es que todavía existen dos patrones de bits para representar el 0 (00..0 y 11..1)
3. Complemento de dos
Para encontrar el negativo de un número, en esta representación, invertimos todos los bits y luego agregamos un bit. Agregar un bit resuelve el problema de tener dos patrones de bits que representan 0. En esta representación, solo tenemos uno (00 ... 0).
Por ejemplo, queremos encontrar la representación binaria negativa de 4 (decimal) usando 4 bits. Primero, convertimos 4 a binario:
4 = 0100
luego invertimos todos los bits
0100 -> 1011
finalmente, agregamos un poco
1011 + 1 = 1100.
Entonces 1100 es equivalente a -4 en decimal si usamos una representación binaria de complemento a dos con 4 bits.
Una forma más rápida de encontrar el complementario es fijando el primer bit como valor 1 e invirtiendo los bits restantes. En el ejemplo anterior, sería algo como:
0100 -> 1100
^^
||-(fixing this value)
|--(inverting this one)
La representación del complemento a dos, además de tener una sola representación para el 0, también suma dos valores binarios de la misma forma que en decimal, números pares con diferentes signos. Sin embargo, es necesario verificar los casos de desbordamiento.
4. Sesgo
Esta representación se utiliza para representar el exponente en la norma IEEE 754 para puntos flotantes. Tiene la ventaja de que el valor binario con todos los bits a cero representa el valor más pequeño. Y el valor binario con todos los bits a 1 representa el valor más grande. Como su nombre indica, el valor está codificado (positivo o negativo) en binario con n bits con sesgo (normalmente 2 ^ (n-1) o 2 ^ (n-1) -1).
Entonces, si estamos usando 8 bits, el valor 1 en decimal se representa en binario usando un sesgo de 2 ^ (n-1), por el valor:
+1 + bias = +1 + 2^(8-1) = 1 + 128 = 129
converting to binary
1000 0001