Estoy tratando de entender cómo Java tiendas entero internamente. Sé que todos java primitivo enteros son firmado, (excepto corto?). Eso significa que un bit menos disponible en un byte para el número.

Mi pregunta es, son todos los números enteros (positivos y negativos) que se almacenan como complemento de dos, o son sólo números negativos en complemento a dos?

Veo que las especificaciones dice x bit two's complement number. Pero a menudo me confundo.

Por ejemplo:

  int x = 15; //Stored as binary as is?  00000000 00000000 00000000 00001111?
  int y = -22; //Stored as two complemented value? 11111111 11111111 11111111 11101010

Editar

Para ser claros, x = 15

   In binary as is: `00000000 00000000 00000000 00001111'
  Two's complement: `11111111 11111111 11111111 11110001`

Así que si su respuesta es all números se almacenan como complemento a dos, entonces:

  int x = 15; //11111111 11111111 11111111 11110001
  int y = -22 //11111111 11111111 11111111 11101010

La confusión he aquí de nuevo el letrero dice, ambos son números negativos. Puede ser que estoy malinterpretando /malentendido?

Editar
No estoy seguro, mi pregunta es confusa. Obligó a aislar a la pregunta:

Mi pregunta precisamente: Son números positivos almacenados en binary as is mientras que los números negativos se almacenan como two's complement?

Algunos dijeron todos se almacenan en complemento a dos y una respuesta que dice que sólo los números negativos se almacenan como complemento a dos.

-cinco números ????????
Dos complementar necesariamente significa que los números positivos están representados por el número de bits de los valores de ese número… al menos como yo la entiendo. EDIT: También, dos cumplido significa un bit menos en el número total de bytes de la primitiva, no uno menos bits POR byte.
su suposición es correcta: números positivos y negativos son complemento a dos, y su x y y son correctos.
Una nota al margen: es algo de un PP, que en Java, un lenguaje de la era de Internet, no tiene el tipo de datos para representar, por ejemplo. TCP/IP, número de puerto (de 16 bits sin signo de valor) con precisión, que conduce a realmente feo código, a veces.
revise el artículo de wiki en.wikipedia.org/wiki/… el complemento a 2 del número que han dado en 15 está mal

OriginalEl autor Kevin Rave | 2012-11-16

10 Comentarios

  1. 77

    Vamos a empezar con un resumen de Java tipos de datos simples:

    byte: tipo de datos Byte es un signo de 8 bits complemento a dos enteros.

    Corto: Corto tipo de datos es de 16 bits con signo complemento a dos enteros.

    int: tipo de datos Int es un signo de 32 bits, complemento a dos enteros.

    largo: tipo de datos Long es un signo de 64 bits, complemento a dos enteros.

    float: tipo de datos Float es de una sola precisión de 32-bit de punto flotante IEEE 754.

    doble: tipo de datos double es un doble precisión de 64-bit de punto flotante IEEE 754.

    booleano: tipo de datos boolean representa un bit de información.

    char: tipo de datos char es un único de caracteres Unicode de 16 bits.

    Fuente

    Complemento a dos

    «El buen ejemplo es el de wiki que la relación con el complemento a dos es realizado por señalar que 256 = 255 + 1, y (255 − x) es el» complemento de x

    0000 0111=7 complemento a dos es 1111 1001= -7

    la forma en que funciona es el MSB(bit más significativo) recibe un valor negativo, por lo que en el caso anterior

    -7 = 1001= -8 + 0+ 0+ 1

    Enteros positivos son generalmente almacenados como simples números binarios (1 es 1, 10 es 2, 11 es 3 y así sucesivamente).

    Enteros negativos se almacenan como el complemento a dos de su valor absoluto. El complemento a dos de un número positivo es cuando el uso de esta notación es un número negativo.

    Fuente

    Ya he recibido un par de puntos para esta respuesta, he decidido añadir más información.

    Una respuesta más detallada:

    Entre otras hay cuatro enfoques principales para representar números positivos y negativos en binario, a saber:

    1. Firmado Magnitud
    2. Un Complemento a
    3. Complemento a dos
    4. Sesgo

    1. Firmado Magnitud

    Utiliza el bit más significativo para representar el signo, el resto de los bits 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 simple. Sin embargo, usted puede agregar los números binarios en la misma forma que agregue números decimales, haciendo más difícil para ser implementado en el nivel de hardware. Por otra parte, este enfoque utiliza dos patrones binarios para representar el 0, 100…0 y 0….0.

    2. Un Complemento a

    En esta representación, debemos invertir 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 a dos

    Para encontrar el negativo de un número, en esta representación, debemos invertir todos los bits y, a continuación, agregue un poco. La adición de un bit resuelve el problema de tener dos patrones de bits que representan a 0. En esta representación, sólo tenemos uno (00…0).

    Por ejemplo, queremos encontrar el binario de la representación negativa de 4 (decimal) utilizando 4 bits. En primer lugar, hemos de convertir 4 a binario:

    4 = 0100

    luego nos invertir todos los bits

    0100 -> 1011

    por último, añadimos un poco

    1011 + 1 = 1100.

    Así 1100 es equivalente a -4 en decimal si estamos usando un Complemento a Dos representación binaria de 4 bits.

    Una manera más rápida de encontrar la complementariedad mediante la fijación del primer bit de valor 1 y la inversión de los restantes bits. En el ejemplo anterior sería algo así como:

    0100 -> 1100
    ^^ 
    ||-(fixing this value)
    |--(inverting this one)

    Complemento a dos de la representación, además de tener sólo una representación de 0, también agrega dos valores binarios de la misma manera que en decimal, incluso los números con signos diferentes. Sin embargo, es necesario verificar el desbordamiento de los casos.

    4. El sesgo de

    Esta representación se utiliza para representar el exponente en la norma IEEE 754 para flotación puntos. 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 el nombre indica, el valor está codificado (positivo o negativo) en binario con n bits con un sesgo (normalmente de 2^(n-1) o 2^(n-1)-1).

    Así que si estamos utilizando 8 bits, el valor 1 en decimal está representado en binario usando un sesgo de 2^(n-1), por el valor de:

    +1 + bias = +1 + 2^(8-1) = 1 + 128 = 129
    converting to binary
    1000 0001
    Mi pregunta precisión: +ve los números almacenados en binary as is mientras ve los números se almacenan en two's complement?
    Los enteros positivos son generalmente almacenados como simples números binarios, y los enteros Negativos se almacenan como el complemento a dos.
    Eso responde a mi pregunta. Cualquier fuente? He encontrado ningún documento que dice claramente esto.
    el enlace de arriba de ecomware.com se rompe @dreamcrash , ¿puede dar algún otro?
    Hola, lo que acerca de esto stackoverflow.com/questions/1049722/what-is-2s-complement

    OriginalEl autor dreamcrash

  2. 53

    Java enteros de 32 bits, y siempre conectado. Esto significa que el bit más significativo (MSB) funciona como el bit de signo. El entero representado por un int no es sino la suma ponderada de los bits. Los pesos se asignan de la siguiente manera:

    Bit#    Weight
    31      -2^31
    30       2^30
    29       2^29
    ...      ...
    2        2^2
    1        2^1
    0        2^0

    Tenga en cuenta que el peso de la MSB es negativo (el más grande de los posibles efectos negativos en realidad), así que cuando este bit está activado, el número total (la suma ponderada) se convierte en negativo.

    Vamos a simular con 4 bits de los números:

    Binary    Weighted sum            Integer value
    0000       0 + 0 + 0 + 0           0
    0001       0 + 0 + 0 + 2^0         1
    0010       0 + 0 + 2^1 + 0         2
    0011       0 + 0 + 2^1 + 2^0       3
    0100       0 + 2^2 + 0 + 0         4
    0101       0 + 2^2 + 0 + 2^0       5
    0110       0 + 2^2 + 2^1 + 0       6
    0111       0 + 2^2 + 2^1 + 2^0     7 -> the most positive value
    1000      -2^3 + 0 + 0 + 0        -8 -> the most negative value
    1001      -2^3 + 0 + 0 + 2^0      -7
    1010      -2^3 + 0 + 2^1 + 0      -6
    1011      -2^3 + 0 + 2^1 + 2^0    -5
    1100      -2^3 + 2^2 + 0 + 0      -4
    1101      -2^3 + 2^2 + 0 + 2^0    -3
    1110      -2^3 + 2^2 + 2^1 + 0    -2
    1111      -2^3 + 2^2 + 2^1 + 2^0  -1

    Así, el complemento a dos cosa no es exclusivo esquema para representar los números enteros negativos, más bien podemos decir que la representación binaria de los números enteros son siempre los mismos, que acaba de negar el peso del bit más significativo. Y que poco se determina el signo del entero.

    En C, hay una palabra clave unsigned (no disponible en java), que puede ser utilizado para declarar unsigned int x;. En los enteros sin signo, el peso de la MSB es positivo (2^31) en lugar de ser negativo. En ese caso, el rango de un unsigned int es 0 a 2^32 - 1, mientras que un int tiene rango -2^31 a 2^31 - 1.

    Desde otro punto de vista, si se considera el complemento a dos de x como ~x + 1 (NO es x más uno), aquí está la explicación:

    Para cualquier x, ~x es sólo el bit a bit inversa de x, por lo que siempre x tiene un 1bits, ~x tendrá un 0-bit (y viceversa). Así que, si se añaden estas, no habrá de llevar en la suma y la suma será sólo un número entero cada poco de que es 1.

    De enteros de 32 bits:

    x + ~x = 1111 1111 1111 1111 1111 1111 1111 1111
    x + ~x + 1 =   1111 1111 1111 1111 1111 1111 1111 1111 + 1
    = 1 0000 0000 0000 0000 0000 0000 0000 0000

    La izquierda 1bits simplemente ser descartado, porque no encaja en 32 bits (desbordamiento de enteros). Así,

    x + ~x + 1 = 0
    -x = ~x + 1

    Así que usted puede ver que la negativa x puede ser representado por ~x + 1, que llamamos el complemento a dos de x.

    Mi pregunta precisión: +ve los números almacenados en binary as is mientras ve los números se almacenan en two's complement?
    Bien, sí. un número negativo es representado a un equipo como el complemento a dos de sus valores positivos.
    Gran respuesta y explicación Bonny @0605002, +1 🙂
    Fabuloso… Mayor explicación que he leído nunca…
    Podría usted dar por favor la referencia a esta respuesta, si alguna? A pesar de que sabía que los conceptos, pero nunca pensó en que forma. Más simple, precisa Respuesta.

    OriginalEl autor 0605002

  3. 10

    He corrido el programa siguiente para saber que

    public class Negative {
    public static void main(String[] args) {
    int i =10;
    int j = -10;
    System.out.println(Integer.toBinaryString(i));
    System.out.println(Integer.toBinaryString(j));
    }
    }

    De salida es

    1010
    11111111111111111111111111110110

    De la salida parece que ha estado usando el complemento a dos.

    Dos complementar de 10 es 11111111 11111111 11111111 11110110. El tuyo impresiones mientras Binario como es de 10 es de 1010. Tan sólo cinco números se almacenan como complemento a dos?
    revise el artículo de wiki en.wikipedia.org/wiki/… el complemento a 2 del número que han dado en 15 está mal
    si la msb bit comienza con 1 será número negativo
    sí complemento a dos de 10, es 11111111 11111111 11111111 11110110 que es de -10
    +ve los números se almacenan como binario dejando el bit de signo en complemento a 2

    OriginalEl autor Dungeon Hunter

  4. 4

    Oracle proporciona algún tipo de documentación sobre Java Tipos de datos que puede encontrar interesante. Específicamente:

    int: El tipo de datos int de 32 bits con signo complemento a dos con signo. Tiene un valor mínimo de-2.147.483.648 y un valor máximo de 2.147.483.647 (inclusive).

    Por cierto, el corto es también almacena como complemento a dos.

    OriginalEl autor matsev

  5. 3

    Según este documento, todos los números enteros son firmado y almacenado en formato de complemento a dos para java. No seguro de su fiabilidad..

    «En formato de complemento a dos, un valor positivo se representa como un simple número binario.» escrito en el mismo documento .. así que técnicamente es correcta, entonces. 🙂

    OriginalEl autor Joel

  6. 2

    El bit más significativo (32) indica que el número es positivo o negativo. Si es 0, significa que el número es positivo y se almacena en su representación binaria. pero si es 1, significa que el número es negativo y se almacena en su complemento a dos de la representación. Así que cuando nos dan peso -2^32 a 32 bits, mientras que la restauración el valor entero de su representación binaria, Podemos obtener la respuesta real.

    Bienvenido a StackOverflow! 😀
    Cuidado de dar la Fuente?

    OriginalEl autor Sazzadur Rahaman

  7. 2

    Gracias, dreamcrash para la respuesta https://stackoverflow.com/a/13422442/1065835; en la página de la wiki dan un ejemplo que me ayudó a entender cómo averiguar la representación binaria de la contraparte negativa de un número positivo.

    Por ejemplo, el uso de 1 byte (= 2 nibbles = 8 bits), el número decimal 5
    está representado por

    0000 01012 El bit más significativo es 0, de modo que el patrón representa un
    valor no negativo. Para convertir a -5 de dos en dos-complemento de la notación, la
    los bits se invierte; 0 se convierte en 1, y 1 se convierte en 0:

    1111 1010 En este punto, en el numeral es el » complemento de la
    valor decimal -5. Para obtener el complemento a dos, se suma 1 a la
    resultado, dando:

    1111 1011 El resultado es un binario con signo de número que representa la
    valor decimal -5 de dos en dos-complemento formulario. Es el bit más significativo
    1, por lo que el valor representado es negativo.

    OriginalEl autor Maksim Dmitriev

  8. 2

    Números positivos son almacenados/retrived como es.

    e.g) For +ve number 10; byte representation will be like 0-000 0010 
    (0 - MSB will represent that it is +ve).
    So while retrieving based on MSB; it says it is +ve, 
    so the value will be taken as it is. 

    Pero los números negativos se almacenan después de complemento a 2 (otros que
    MSB bit), y MSB bit se establece en 1.

    e.g) cuando el almacenamiento de -10 a continuación,

      0-000 0010  -> (1's complement) -> 0-111 1101 
    -> (2's complement) 0-111 1101 + 1 -> 0-111 1110
    Now MSB will be set to one, since it is negative no -> 1-111 1110

    cuando se recupera, se encontró que el MSB es 1. Así es negativo no.
    Y complemento a 2 se lleva a cabo otro tipo de MSB.

      1-111 1110  --> 1-000 0001 + 1 --> 1-000 0010
    Since MSB representing this is negative 10 --> hence  -10 will be retrived.

    Casting

    También tenga en cuenta que cuando usted está lanzando int/corto a byte, sólo el último byte serán considerados junto con el último byte MSB,

    Tomar ejemplo «-130» corto, puede ser almacenado como el de abajo,

    (MSB)1-(2's complement of)130(1000 0010) --> 1-111 1111 0111 1110

    Ahora byte de fundición tomó el último byte que es 0111 1110. (0-MSB)
    Desde MSB dice que es +ve valor, por lo que se tomará como es.
    Que es de 126. (+ve).

    Tomar otro ejemplo «130» corto, puede ser almacenado como el de abajo,

      0-000 000 1000 0010     (MSB = 0)

    Ahora byte de fundición tomó el último byte que es 1000 0010 . (1=MSB)
    Desde MSB dice que es -ve valor, complemento a 2 se llevará a cabo y el número negativo será devuelto. Así que en este caso -126 será devuelto.

     1-000 0010  -> (1's complement) -> 1-111 1101 
    -> (2's complement) 1-111 1101 + 1 -> 1-111 1110 -> (-)111 1110
    = -126

    Diff entre (int)(char)(byte) -1 Y (int)(corto)(byte) -1

    (byte)-1       -> 0-000 0001 (2's Comp) -> 0-111 1111 (add sign) -> 1-111 1111
    (char)(byte)-1 -> 1-111 1111 1111 1111  (sign bit is carry forwarded on left) 

    del mismo modo

    (short)(byte)-1-> 1-111 1111 1111 1111  (sign bit is carry forwarded on left) 

    Pero

    (int)(char)(byte)-1 -> 0-0000000 00000000 11111111 11111111  = 65535
    since char is unsigned; MSB won't be carry forwarded. 

    Y

    (int)(Short)(byte)-1 -> 1-1111111 11111111 11111111 11111111 = -1
    since short is signed; MSB is be carry forwarded. 

    Referencias

    ¿Por qué es complemento a dos se utiliza para representar números negativos?

    ¿Qué es el «Complemento a 2»?

    OriginalEl autor Kanagavelu Sugumar

  9. 1

    números positivos se almacenan directamente en el binario. 2 del elogio es necesaria para los números negativos.

    por ejemplo:

    15 : 00000000 00000000 00000000 00001111

    -15: 11111111 11111111 11111111 11110001

    aquí es la diferencia en el signo de bit.

    OriginalEl autor Siva Padhy

  10. 1

    Por entero positivo 2’complement valor es lo mismo con el MSB bit 0 (like +14 2'complement is 01110).

    Sólo entero negativo sólo estamos calculando 2’complement valor (-14= 10001+1 = 10010).

    Así que la respuesta final es que tanto los valores(+ve and -ve) se almacenan en 2’complement sólo de una forma.

    OriginalEl autor Mangesh Gawali

Dejar respuesta

Please enter your comment!
Please enter your name here