11

Javaの整数は署名されているため、Javaの整数の最大値は2147483647ですよね?

0xff000000 の数値は 4278190080 です。

それでも、次のような Java コードが表示されます。

int ALPHA_MASK = 0xff000000;

誰か教えてください。

4

5 に答える 5

43

エリクソンの答えへの単なる追加:

彼が言ったように、符号付き整数は、ほとんどのコンピュータアーキテクチャでそれぞれの正の値の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です。

于 2008-11-25T23:42:21.930 に答える
26

上位ビットは符号ビットです。これを設定すると、負の数 (-16777216) が示されます。

Java は、ほとんどの言語と同様に、符号付き数値を2 の補数形式で格納します。この場合、0x7F000000 または 2130706432 から2 31または 2147483648 を引くと、-16777216 が得られます。

于 2008-11-25T23:03:11.320 に答える
8

おそらく指摘する価値のあること-このコードは、数値を含む整数として使用することを意図していません。目的は、32 ビットのカラー値からアルファ チャネルをフィルター処理するためのビットマスクとしてです。この変数は、上位 8 ビットがオンになっているバイナリ マスクのように、実際には数値と考えるべきではありません。

于 2008-11-26T00:02:46.193 に答える
1

余分なビットは符号用です

Java int は2 の補数です

于 2008-11-25T23:02:01.433 に答える
0

int は Java で署名されています。

于 2008-11-25T23:06:10.660 に答える