Javaの整数は署名されているため、Javaの整数の最大値は2147483647ですよね?
0xff000000 の数値は 4278190080 です。
それでも、次のような Java コードが表示されます。
int ALPHA_MASK = 0xff000000;
誰か教えてください。
エリクソンの答えへの単なる追加:
彼が言ったように、符号付き整数は、ほとんどのコンピュータアーキテクチャでそれぞれの正の値の2の補数として格納されます。
つまり、2 ^ 32の可能な値全体が2つのセットに分割されます。1つは0ビットで始まる正の値用で、もう1つは1で始まる負の値用です。
ここで、3ビットの数値に制限されていると想像してください。すぐに意味のある面白い方法でそれらを配置しましょう:
000
111 001
110 010
101 011
100
左側のすべての数値は1ビットで始まり、右側の数値は0で始まることがわかります。前者を負、後者を正として宣言するという以前の決定により、001であることがわかります。 、010、011が唯一の正の数であるのに対し、111、110、101はそれぞれ負の数です。
では、それぞれ上部と下部にある2つの数字をどうしますか?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ビットで始まるため)なので、絶対値/正の対応物を計算します。
つまり、2の補数を取ります
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です。
上位ビットは符号ビットです。これを設定すると、負の数 (-16777216) が示されます。
Java は、ほとんどの言語と同様に、符号付き数値を2 の補数形式で格納します。この場合、0x7F000000 または 2130706432 から2 31または 2147483648 を引くと、-16777216 が得られます。
おそらく指摘する価値のあること-このコードは、数値を含む整数として使用することを意図していません。目的は、32 ビットのカラー値からアルファ チャネルをフィルター処理するためのビットマスクとしてです。この変数は、上位 8 ビットがオンになっているバイナリ マスクのように、実際には数値と考えるべきではありません。
余分なビットは符号用です
Java int は2 の補数です
int は Java で署名されています。