Java中的整數最大值是2147483647,因爲Java整數是有符號的,對吧?爲什麼Java能夠將0xff000000存儲爲int?
0xff000000有4278190080.
數值然而我看到的Java代碼:
int ALPHA_MASK = 0xff000000;
誰能賜教嗎?
Java中的整數最大值是2147483647,因爲Java整數是有符號的,對吧?爲什麼Java能夠將0xff000000存儲爲int?
0xff000000有4278190080.
數值然而我看到的Java代碼:
int ALPHA_MASK = 0xff000000;
誰能賜教嗎?
最高位爲符號位。設置它表示負數:-16777216。
與大多數語言一樣,Java以2's complement形式存儲帶符號的數字。在這種情況下,從0x7F000000或2130706432中減去2 或2147483648產生-16777216。
額外位是符號
的Java int爲twos complement
ints用Java簽名。
只是一個除了埃裏克森的回答:
正如他所說的,符號的整數存儲爲二進制補碼,可以在大多數計算機體系結構各自的正值。
即,整個2^32個可能的值被分成兩組:一個用於以0開始位正值和一個負值開始用1
現在,假設我們'限於3位數字。讓我們安排他們在一個有趣的方式將是有意義的第二:
000
111 001
110 010
101 011
100
您將看到在左側的所有數字與1位開始,而在右邊,他們開始根據我們先前決定宣佈前者爲負值而後者爲正值,我們看到001,010和011是唯一可能的正數,而111,110和101是它們各自的負值。
現在我們如何分別處理頂部和底部的兩個數字? 000顯然應該是零,而100將是所有沒有正面對應物的最低負數。總結:
000 (0)
111 001 (-1/1)
110 010 (-2/2)
101 011 (-3/3)
100 (-4)
您可能注意到,您可以通過否定1(001),並加入1(001)得到它的-1(111)的位模式: 001(= 1) - > 110 + 001 - > 111(= -1)
現在回到你的問題:
0xff000000 = 1111 1111 0000 0000 0000 0000 0000 0000
我們不必在前面加零的進一步因爲我們已經達到了32位的最大值。 此外,它顯然是一個負數(因爲它開始與1位),所以我們現在要計算其絕對值/正副本:
這意味着,我們將採取的
補碼1111 1111 0000 0000 0000 0000 0000 0000
這是
0000 0000 1111 1111 1111 1111 1111 1111
然後,我們添加
0000 0000 0000 0000 0000 0000 0000 0001
並獲得
0000 0001 0000 0000 0000 0000 0000 0000 = 16777216
因此,0xff000000 = -16777216。
一些可能值得指出的東西 - 這個代碼並不意味着被用作一個帶有數值的整數;目的是作爲一個位掩碼來過濾掉32位顏色值中的alpha通道。這個變量甚至不應該被認爲是一個數字,就像打開高8位的二進制掩碼一樣。
@Kitsune(和/或任何人不知道這一點):這是一個很好的解釋。閱讀它可能需要幾次,但我建議您閱讀它,直到它真的有意義。 – 2008-11-25 23:47:15