2017-10-06 80 views
2

我的理解是,具有alpha值示例的RGB值可能是0xffhexcodeJava如何處理alpha通道?

但是,我不明白的是如何0xff0000ff,一個具有最大alpha值的純藍色,是一個大於Integer.MAX_VALUE的整數值。 Java中的下劃線編碼如何允許這種情況發生?

回答

1

這是一個有趣的問題,歸結爲整數文字的定義。有關完整參考信息,請參閱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); 

兩條線路將輸出正確的。

1

intInteger已簽名,您使用的十六進制表示法是無符號的。

EG嘗試這樣的事:

System.out.printf("%x%n", -1); 

將輸出:

FFFFFFFF

2

其實像素的範圍是整數的兩倍最大值,因爲整數簽署而像素是無符號整數。所以一些顏色具有負整數值。例如。白色= -1