为什么Java能够将0xff000000存储为int?

Java中的整数最大值是2147483647,因为Java整数是签名的,对吗?

0xff000000的数值为4278190080。

但我看到Java代码是这样的:

int ALPHA_MASK = 0xff000000; 

有人可以开导我吗?

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

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

只是埃里克森答案的补充:

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

也就是说,整个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。

可能值得指出的东西 – 这段代码不能用作带数值的整数; 目的是作为位掩码从32位颜色值中过滤掉alpha通道。 这个变量实际上甚至不应该被认为是一个数字,就像打开高8位的二进制掩码一样。

额外的位用于标志

Java整数是两个补充

int用Java签名。