11

Java 中整数的最大值是 2147483647,因为 Java 整数是有符号的,对吧?

0xff000000 的数值为 4278190080。

然而我看到这样的Java代码:

int ALPHA_MASK = 0xff000000;

任何人都可以启发我吗?

4

5 回答 5

43

只是对埃里克森的回答的补充:

正如他所说,有符号整数在大多数计算机体系结构上存储为它们各自正值的补码。

也就是说,整个 2^32 个可能的值被分成两组:一组用于以 0 位开头的正值,一组用于以 1 开头的负值。

现在,假设我们仅限于 3 位数字。让我们以一种有趣的方式来排列它们,这将在一秒钟内变得有意义:

     000
  111   001 
110       010
  101   011  
     100  

您会看到左侧的所有数字都以 1 位开头,而右侧的所有数字都以 0 开头。根据我们之前将前者声明为负数而将后者声明为正数的决定,我们看到 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。

于 2008-11-25T23:42:21.930 回答
26

高位是符号位。设置它表示一个负数:-16777216。

与大多数语言一样,Java 以2 的补码形式存储带符号的数字。在这种情况下,从 0x7F000000 或 2130706432 中减去 2 31或 2147483648 得到 -16777216。

于 2008-11-25T23:03:11.320 回答
8

可能值得指出的一点 - 这段代码不打算用作带有数值的整数;目的是作为位掩码从 32 位颜色值中过滤掉 Alpha 通道。这个变量真的不应该被认为是一个数字,只是一个高 8 位打开的二进制掩码。

于 2008-11-26T00:02:46.193 回答
1

额外的位用于标志

Java 整数是二进制补码

于 2008-11-25T23:02:01.433 回答
0

整数是用 Java 签名的。

于 2008-11-25T23:06:10.660 回答