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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top