Perché Java è in grado di memorizzare 0xff000000 come int?
Domanda
Il valore massimo di un numero intero in Java è 2147483647, poiché i numeri interi Java sono firmati, giusto?
0xff000000 ha un valore numerico di 4278190080.
Eppure vedo il codice Java in questo modo:
int ALPHA_MASK = 0xff000000;
Qualcuno può illuminarmi per favore?
Soluzione
Il bit alto è un bit di segno. L'impostazione indica un numero negativo: -16777216.
Java, come la maggior parte delle lingue, memorizza i numeri firmati nel il complemento di 2 . In questo caso, sottraendo 2 31 o 2147483648 da 0x7F000000 o 2130706432, si ottiene -16777216.
Altri suggerimenti
Solo un'aggiunta alla risposta di Erickson:
Come ha detto, gli interi con segno sono archiviati come complementi di due per il loro rispettivo valore positivo sulla maggior parte delle architetture di computer.
Cioè, l'intero 2 ^ 32 valori possibili sono suddivisi in due set: uno per i valori positivi che iniziano con uno 0-bit e uno per i valori negativi che iniziano con uno 1.
Ora, immagina di essere limitati a numeri a 3 bit. Sistemiamoli in un modo divertente che avrà un senso in un secondo:
000
111 001
110 010
101 011
100
Vedi che tutti i numeri sul lato sinistro iniziano con un 1 bit mentre sul lato destro iniziano con uno 0. Con la nostra precedente decisione di dichiarare il primo come negativo e il secondo come positivo, noi vedi che 001, 010 e 011 sono gli unici possibili numeri positivi mentre 111, 110 e 101 sono le loro rispettive controparti negative.
Ora cosa facciamo con i due numeri che si trovano in cima e in fondo, rispettivamente? 000 dovrebbe essere zero, ovviamente, e 100 sarà il numero negativo più basso di tutti che non ha una controparte positiva. Riassumendo:
000 (0)
111 001 (-1 / 1)
110 010 (-2 / 2)
101 011 (-3 / 3)
100 (-4)
Potresti notare che puoi ottenere il modello di bit di -1 (111) negando 1 (001) e aggiungendo 1 (001) ad esso: 001 (= 1) - > 110 + 001 - > 111 (= -1)
Tornando alla tua domanda:
0xff000000 = 1111 1111 0000 0000 0000 0000 0000 0000
Non è necessario aggiungere ulteriori zeri prima di esso poiché abbiamo già raggiunto il massimo di 32 bit. Inoltre, è ovviamente un numero negativo (poiché inizia con un 1 bit), quindi ora calcoleremo il suo valore assoluto / controparte positiva:
Questo significa che prenderemo il complemento a due di
1111 1111 0000 0000 0000 0000 0000 0000
che è
0000 0000 1111 1111 1111 1111 1111 1111
Quindi aggiungiamo
0000 0000 0000 0000 0000 0000 0000 0001
e ottieni
0000 0001 0000 0000 0000 0000 0000 0000 = 16777216
Pertanto, 0xff000000 = -16777216.
Qualcosa che probabilmente vale la pena sottolineare: questo codice non è pensato per essere usato come un numero intero con un valore numerico; Lo scopo è come maschera di bit per filtrare il canale alfa da un valore di colore a 32 bit. Questa variabile non dovrebbe nemmeno essere pensata come un numero, proprio come una maschera binaria con gli 8 bit alti attivati.
il bit in più è per il segno
Gli ints Java sono due complementi
gli ints sono firmati in Java.