Java中整数的最大值是2147483647,因为Java的整数是有符号的,对吗?
0xff000000的数值为4278190080。
但是我看到像这样的Java代码:
int ALPHA_MASK = 0xff000000;
有人可以解释一下吗?
补充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。高位是符号位。将其设置表示负数:-16777216。
Java和大多数编程语言一样,使用二进制补码形式存储有符号数。在这种情况下,从0x7F000000或2130706432中减去2的31次方或2147483648,得到的结果为-16777216。
有一点值得注意的是,这段代码并不意味着它可以被视为具有数值的整数;其目的是作为一个位掩码来过滤掉32位颜色值中的alpha通道。这个变量真的不应该被看作是一个数字,只是一个二进制掩码,并且高8位被打开。
在Java中,整数是带符号的。