我的理解是,具有alpha值示例的RGB值可能是0xffhexcode
。Java如何處理alpha通道?
但是,我不明白的是如何0xff0000ff
,一個具有最大alpha值的純藍色,是一個大於Integer.MAX_VALUE
的整數值。 Java中的下劃線編碼如何允許這種情況發生?
我的理解是,具有alpha值示例的RGB值可能是0xffhexcode
。Java如何處理alpha通道?
但是,我不明白的是如何0xff0000ff
,一個具有最大alpha值的純藍色,是一個大於Integer.MAX_VALUE
的整數值。 Java中的下劃線編碼如何允許這種情況發生?
這是一個有趣的問題,歸結爲整數文字的定義。有關完整參考信息,請參閱https://docs.oracle.com/javase/specs/jls/se9/html/jls-3.html#jls-3.10.1
的語言規格問題的癥結在於,對於以小數表示的整數文字,您只能表示正整數。使用十六進制文字,您可以表達正值和負值。具體來說,如果第一位打開,則該值爲負值。
引述語言規格:
的十進制標號是任一單ASCII數字0,表示 整數零,或由選自1至9任選 的ASCII數字,然後通過一個或多個的從0到9的ASCII數字穿插着 下劃線,表示一個正整數。
一個十六進制數字由主導ASCII字符0x或 0X隨後用 下劃線散佈的一個或多個ASCII十六進制數字的,並且可以代表正,零或負的整數。
因此,準確地說0xffffffff實際上並不比Integer.MAX_VALUE大,因爲它是負數(由於前導位處於打開狀態)。也增加了東西,不看的權利乍一看,你可以嘗試:
System.out.println(Integer.MAX_VALUE == 0x7fffffff);
System.out.println(Integer.MIN_VALUE == 0x80000000);
兩條線路將輸出正確的。
int
和Integer
已簽名,您使用的十六進制表示法是無符號的。
EG嘗試這樣的事:
System.out.printf("%x%n", -1);
將輸出:
FFFFFFFF
其實像素的範圍是整數的兩倍最大值,因爲整數簽署而像素是無符號整數。所以一些顏色具有負整數值。例如。白色= -1