2009-11-05 5 views

risposta

1

Poiché Java (e la maggior parte delle lingue) rappresentano valori interi negativi utilizzando two's-complement math. Nel complemento a due, 0xFF (11111111) rappresenta (in un int firmato) il valore -1.

17

I byte sono firmati in Java. In binario 0x00 è 0, 0x01 è 1 e così via, ma tutto 1s (cioè 0xFF) è -1, 0xFE è -2 e così via. Vedi Two's complement, che è il meccanismo di codifica binaria utilizzato.

+2

E Java sta facendo l'estensione del segno quando espande il byte in un int. http://en.wikipedia.org/wiki/Two%27s_complement#Sign_extension – shf301

+0

in realtà l'estensione del segno è hte ragione giusta –

13
  1. b viene promosso a un int nel determinare quale sovraccarico system.out.println da chiamare.

  2. Tutti i byte in Java sono firmati.

  3. Il byte firmato 0xff rappresenta il valore -1. Questo perché Java utilizza two's complement per rappresentare i valori firmati. Il byte firmato 0xff rappresenta -1 perché il suo bit più significativo è 1 (quindi rappresenta un valore negativo) e il suo valore è -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1.

-1

Non è solo Java che fa la matematica del complemento a 2. Questo è il modo in cui ogni microprocessore e DSP che posso pensare fa matematica. Quindi, è come ogni linguaggio di programmazione lo rappresenta.

+2

In senso stretto, alcuni linguaggi (ad esempio C e C++) non specificano quale rappresentazione viene utilizzata per i numeri interi. È specifico per piattaforma. d'altra parte Java * fa * specifica la rappresentazione del complemento a 2. –

5

forse la tua confusione deriva dal motivo per cui (byte)0xFF è in qualche modo uguale a (int)0xFFFFFFFF. Quello che sta succedendo qui è la promozione da tipi firmati più piccoli a più grandi, il valore più piccolo è con estensione, in cui il bit più significativo viene copiato su tutti i nuovi bit del valore promosso. un tipo unsigned non diventerà sign-extended, ottengono zero estese, i nuovi bit saranno sempre zero.

Se ti aiuta a inghiottirlo, pensalo in questo modo, ogni numero intero di qualsiasi dimensione ha anche alcuni bit "fantasma" troppo significativi per essere rappresentati. sono lì, ma non sono memorizzati nella variabile. un numero negativo ha quei bit non nulli, e i numeri positivi hanno tutti gli zeri per i bit fantasma quando si promuove un valore inferiore a uno più grande, quei bit fantasma diventano bit reali.

-1

ridotto modulo

byte = 256 0xff = 255

255/256 -> 255 resto

Così 255 - 256 = -1

semplice logica Acclamazioni