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

时间:2008-11-25 23:00:47

标签: java hex int

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

0xff000000的数值为4278190080。

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

int ALPHA_MASK = 0xff000000;

有人可以开导我吗?

5 个答案:

答案 0 :(得分:40)

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

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

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

答案 1 :(得分:25)

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

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

答案 2 :(得分:7)

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

答案 3 :(得分:1)

额外的位用于符号

Java整数是twos complement

答案 4 :(得分:0)

ints用Java签名。