Perché byte b = (byte) 0xFF
è uguale a integer
-1
?Perché byte b = (byte) 0xFF è uguale a intero -1?
Es:
int value = byte b = (byte) 0xFF;
System.out.println(value);
verrà stampata -1
?
Perché byte b = (byte) 0xFF
è uguale a integer
-1
?Perché byte b = (byte) 0xFF è uguale a intero -1?
Es:
int value = byte b = (byte) 0xFF;
System.out.println(value);
verrà stampata -1
?
Se si utilizza un int firmato 0xFF = -1 a causa del complemento a 2.
questo articolo wiki spiega bene, vedere la tabella a destra: http://en.wikipedia.org/wiki/Two%27s_complement
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.
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.
b
viene promosso a un int
nel determinare quale sovraccarico system.out.println
da chiamare.
Tutti i byte in Java sono firmati.
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
.
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.
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. –
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.
ridotto modulo
byte = 256 0xff = 255
255/256 -> 255 resto
Così 255 - 256 = -1
semplice logica Acclamazioni
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
in realtà l'estensione del segno è hte ragione giusta –