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

11

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

0xff000000的数值为4278190080。

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

int ALPHA_MASK = 0xff000000;

有人可以解释一下吗?

5个回答

43

补充erickson的回答:

正如他所说,在大多数计算机架构中,有符号整数被存储为它们各自正值的二进制补码形式。

也就是说,所有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。

@Kitsune(以及任何还不知道这个的人):这是一个很好的解释。可能需要读几遍,但我建议你一直读下去,直到真正理解为止。 - Bill K

26

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

Java和大多数编程语言一样,使用二进制补码形式存储有符号数。在这种情况下,从0x7F000000或2130706432中减去2的31次方或2147483648,得到的结果为-16777216。


8

有一点值得注意的是,这段代码并不意味着它可以被视为具有数值的整数;其目的是作为一个位掩码来过滤掉32位颜色值中的alpha通道。这个变量真的不应该被看作是一个数字,只是一个二进制掩码,并且高8位被打开。


1

额外的一位是用来表示符号的

Java中的整数采用二进制补码表示


0

在Java中,整数是带符号的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接