Perché Java è in grado di memorizzare 0xff000000 come int?

Il valore massimo di un intero in Java è 2147483647, poiché gli interi Java sono firmati, giusto?

0xff000000 ha un valore numerico di 4278190080.

Eppure vedo il codice Java come questo:

int ALPHA_MASK = 0xff000000; 

Qualcuno può illuminarmi per favore?

Il bit più alto è un bit di segno. Impostandolo si indica un numero negativo: -16777216.

Java, come la maggior parte delle lingue, memorizza i numeri firmati nella forma complementare a 2 . In questo caso, sottraendo 2 31 o 2147483648 da 0x7F000000 o 2130706432, si ottiene -16777216.

Solo un’aggiunta alla risposta di erickson:

Come ha detto, gli interi firmati vengono memorizzati come complementi di due al rispettivo valore positivo sulla maggior parte delle architetture dei computer.

Cioè, l’intero 2 ^ 32 valori possibili sono divisi in due gruppi: uno per i valori positivi che iniziano con uno 0 bit e uno per i valori negativi che iniziano con un 1.

Ora, immagina che siamo limitati a numeri a 3 bit. Sistemiamoli in un modo divertente che abbia senso in un secondo:

  000 111 001 110 010 101 011 100 

Vedete 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, vediamo che 001 , 010 e 011 sono gli unici numeri positivi possibili mentre 111, 110 e 101 sono le rispettive controparti negative.

Ora cosa facciamo con i due numeri che sono rispettivamente in alto e in basso? 000 dovrebbe essere zero, ovviamente, e 100 sarà il numero negativo più basso di tutto ciò che non ha una controparte positiva. Riassumere:

  000 (0) 111 001 (-1 / 1) 110 010 (-2 / 2) 101 011 (-3 / 3) 100 (-4) 

Si potrebbe notare che è ansible ottenere il modello di bit di -1 (111) annullando 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 abbiamo bisogno di aggiungere ulteriori zeri di fronte a come abbiamo già raggiunto il massimo di 32 bit. Inoltre, è ovviamente un numero negativo (dato che inizia con un 1 bit), quindi ora calcoleremo il suo valore assoluto / contropartita positiva:

Ciò 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 ottenere

 0000 0001 0000 0000 0000 0000 0000 0000 = 16777216 

Pertanto, 0xff000000 = -16777216.

Qualcosa probabilmente degno di nota: questo codice non è pensato per essere usato come un numero intero con un valore numerico; Lo scopo è come una maschera di bit per filtrare il canale alfa da un valore di colore a 32 bit. Questa variabile in realtà non dovrebbe nemmeno essere pensata come un numero, proprio come una maschera binaria con gli 8 bit alti triggersti.

il bit in più è per il segno

Gli in Java sono due complementi

gli interi sono firmati in Java.