質問

Javaの整数の最大値は2147483647です。Javaの整数は符号付きだからですよね

0xff000000の数値は4278190080です。

まだ次のようなJavaコードが表示されます:

int ALPHA_MASK = 0xff000000;

誰かが私を啓発してもらえますか?

役に立ちましたか?

解決

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

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

他のヒント

エリクソンの答えに加えて:

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

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

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

Java intは 2の補数

です。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top